Changes to `arg' - Bug in #! processing & "pear broken..."
Garance A Drosehn
gad at FreeBSD.org
Fri Jun 10 19:37:50 GMT 2005
As most people are probably tired of hearing, I recently changed the
way the kernel parses #!-lines in shell scripts. This solves some
problems with scripts that only break on FreeBSD, but it also
removed some nice flexibility that FreeBSD has supported for many
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'. Right now all three are wrapped up in a single
update, but then the options are somewhat tied together. I could
split them apart for committing.
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
(and *that* parsing-change will *not* be MFC-ed!).
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
#!/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.
All of new options put together will just about double the size
of `env' on my system:
root wheel 4184 Jun 10 01:08 /usr/bin/env*
root wheel 7360 Jun 10 14:31 /usr/bin/env-rel6*
root wheel 8948 Jun 6 01:58 /usr/bin/env*
root wheel 11912 Jun 10 14:28 /usr/bin/env-rel6*
root wheel 6040 Jun 10 14:51 /usr/bin/env*
root wheel 10008 Jun 10 14:52 /usr/bin/env-rel6*
It does compile with WARNS=6 on the above three platforms, but
then it did that before I started.
The actual update is presently over 300 lines, so I'll just include
a pointer to it:
It has only had some light testing, so I'm sure there's at least a
few bugs in there somewhere. I have not made any changes to the man
page yet, but the comments should give you a good idea of how I
*mean* for it to work.
So, is this overkill? I think these features would be useful...
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