Changes to `arg' - Bug in #! processing & "pear broken..."

Garance A Drosehn gad at
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
years now.

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
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.

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
Senior Systems Programmer               or   gad at
Rensselaer Polytechnic Institute;             Troy, NY;  USA

More information about the freebsd-ports mailing list