Changes to `env' command - Bug in #! processing...
Garance A Drosehn
gad at FreeBSD.org
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:
>http://people.freebsd.org/~gad/env-rel6.diff
The update is now 486 lines, and has moved to:
http://people.freebsd.org/~gad/env/env-rel6.diff
The resulting source file is also available at:
http://people.freebsd.org/~gad/env/env.c
Scream now, or, well, scream later...
--
Garance Alistair Drosehn = gad at gilead.netel.rpi.edu
Senior Systems Programmer or gad at FreeBSD.org
Rensselaer Polytechnic Institute; Troy, NY; USA
More information about the freebsd-ports
mailing list