Changes to `env' command - Bug in #! processing...

Garance A Drosehn gad at
Wed Jun 15 02:37:32 GMT 2005

Amusingly enough, I had originally posted this as "Changes to the `arg'
command".  That might be a very popular command, if implemented right.

Anyway, an update on proposed changes to `env':

At 3:37 PM -0400 6/10/05, Garance A Drosehn wrote:
>As most people are probably tired of hearing, I recently changed
>the way the kernel parses #!-lines in shell scripts.
>I now propose to re-implement that flexibility (and more!) via some
>changes to the `env' command.  The changes add three new (non-standard)
>options to `env'.
>I'd like to commit these changes to 6.0, and they should also be fine
>to MFC to 5.x.  They do not depend on the change in kernel-parsing
>The three new options are:
>     -v        -- Turns up a verbosity setting, useful for seeing
>                  what `env' is doing.  Particularly useful for
>                  debugging the following options.
>    -S string  -- "split string on spaces".  The idea is to take
>                  a single string, split it into separate arguments,
>                  and then process those arguments.  This supports
>                  single-quoted strings, double-quoted strings, and
>                  a few other features that the previous parsing
>                  code was never going to support.
>    -P altpath -- specify a path list to use when searching for the
>                  'utility' (program to execute).  `env' does the
>                  search itself, without checking or changing the
>                  present value of PATH.  This was implemented by
>                  copying a few routines from the `which' command.
>Note that due to the parsing-change in 6.0, the -P option is
>pretty much worthless for scripts in 6.0 without the -S option.
>These options would then let you have a script start with:
>    #!/usr/bin/env -S /usr/local/bin/php -n -q -dsafe_mode=0
>which would work exactly the way that:
>    #!/usr/local/bin/php -n -q -dsafe_mode=0
>does in 5.x-stable.  They would also let you have a script which
>starts with:
>    #!/usr/bin/env -S -P/usr/local/bin:/usr/bin perl
>and the script will execute /usr/local/bin/perl or /usr/bin/perl,
>without caring about the present setting for PATH=, and without
>changing what value the script will see for PATH= when it executes.

I have worked on it some more, and the -S processing now also
supports ${SOMEVAR} references.  The ${}-format is required, and
all it supports is environment variables.  This gives users even
more flexibility that they did not have with the previous kernel-
parsing of options.

I also wrote up some regression tests for all these changes.  Right
now I have 27 tests, but I intend to have several more by the time
I'm ready to commit it.

>The actual update is presently over 300 lines, so I'll just
>include a pointer to it:

The update is now 486 lines, and has moved to:

The resulting source file is also available at:

Scream now, or, well, scream later...

Garance Alistair Drosehn     =      gad at
Senior Systems Programmer               or   gad at
Rensselaer Polytechnic Institute;             Troy, NY;  USA

More information about the freebsd-ports mailing list