tech-pkg archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

Re: handle #! /usr/bin/env



On Sun, 03 Mar 2013, matthew sporleder wrote:
Okay, sorry to develop this on the mailing list but I got a new update.
I'm mainly interested in comments about the idea.  I think it saves a
lot of hassle.

1{ /env -i/!s|^#![[:space:]]*/usr/bin/env|#!|;}

You could do it all in a single command.  The idea is:

If this is line 1:
   If line has "#!", optional space, optional {"/use/bin/env"
        followed by one or more spaces}, and finally the
        interpreter you were looking for, then replace it all
        with "#!" followed by the new interpreter.

I don't see the need for a special case for "/usr/bin/env -i". Firstly, many systems (including NetBSD) prohibit multiple arguments on the "#!" line, so stuff like "#!/usr/bin/env -i foo" will fail often enough that people learn not to write such code. Secondly, scripts in which you don't want the substitution to occur should not be passed to the REPLACE infrastructure. If, despite this, you want to avoid accidentally matching "/usr/bin/env -i foo", then you can change the REPLACE.sys-foo.old regexps to use "[^[:space:]]*" instead of ".*".

Here's patch (untested).

--apb (Alan Barrett)

Index: mk/configure/replace-interpreter.mk
===================================================================
--- mk/configure/replace-interpreter.mk 6 Feb 2012 06:18:36 -0000       1.11
+++ mk/configure/replace-interpreter.mk 4 Mar 2013 16:19:09 -0000
@@ -90,6 +90,9 @@ REPLACE.sys-sh.new=   ${SH}
 REPLACE_FILES.sys-sh=  ${REPLACE_SH}
 .endif
+# sed regexp to match optional "/usr/bin/env" followed by one or more spaces
+REPLACE.optional-env-space=    (/usr/bin/env[[:space:]][[:space:]]*)?
+
 .PHONY: replace-interpreter
 replace-interpreter:
 .for _lang_ in ${REPLACE_INTERPRETER}
@@ -99,7 +102,7 @@ replace-interpreter:
        cd ${WRKSRC};                                                   \
        for f in ${REPLACE_FILES.${_lang_}}; do                         \
                if [ -f "$${f}" ]; then                                       \
-                       ${SED} -e 
'1s|^#![[:space:]]*${REPLACE.${_lang_}.old}|#!${REPLACE.${_lang_}.new}|' \
+                       ${SED} -e 
'1s|^#![[:space:]]*${REPLACE.optional-env-space}${REPLACE.${_lang_}.old}|#!${REPLACE.${_lang_}.new}|'
 \
                        < "$${f}" > "$${f}.new";                      \
                        if [ -x "$${f}" ]; then                               \
                                ${CHMOD} a+x "$${f}.new";             \


Home | Main Index | Thread Index | Old Index