2012-08-09 13 views
11

¿Es posible especificar una línea shebang sin conocer la ruta del programa que desea ejecutar?Shell script shebang para ruta desconocida

quizá no especifique la ruta

#!node 

o especificar varias opciones

#!/usr/local/bin/node 
#!/usr/bin/node 

puntos adicionales para la solución de plataforma cruzada (varios sabores de Linux, BSD, OSX etc ...)

Respuesta

14

/usr/bin/env está pensado específicamente para soluciones multiplataforma.

env executes utility after modifying the environment as specified on 
the command line. The option name=value specifies an environmental 
variable, name, with a value of value. The option `-i' causes env 
to completely ignore the environment it inherits. 

If no utility is specified, env prints out the names and values of 
the variables in the environment, with one name=value pair per line. 

así que algo en las líneas de:

#!/usr/bin/env node 

Va ser multiplataforma y "el camino correcto a seguir".

+0

+1 Tan multiplataforma como sea posible. Tristemente, POSIX no especifica dónde está 'env', pero todavía no he encontrado un sistema donde no esté en'/usr/bin'. ¿Alguien ha visto un sistema operativo funky donde no está? – Jens

+0

¿es posible pasar varios programas interconectados en la línea shebang? ('! #/usr/bin/env cat | nl') –

+0

No, imposible. Use un script separado si debe. – Jens

-2

Ponga un espacio después del shebang. Si el programa está en la variable de entorno PATH, debería irse.

#! perl 

Por supuesto, un caso especial para Perl sería

: 
eval 'exec perl -S $0 ${1+"[email protected]"}' 
    if 0; 

Esto funciona en UNIX y OSX, incluso cuando no hay/usr/bin/env como señaló @Jens

+0

no funciona para mí en OSX - pero gracias –

-2

No utilice shebang.

node <<eof 
your node program here 
eof 
+0

@ the-guy-who-downvoted ¿por qué no es una buena idea? –

+0

No soy el que menosprecia, pero esto ni siquiera aborda su pregunta y, por lo tanto, no puede resolver su problema. – Jens

+1

Funciona en todos los sistemas compatibles con POSIX, puede agregar opciones al comando y redirigir la salida. En Linux, este #!/usr/bin/env sh -x no funciona. – hipe

0

Contrariamente a lo que la gente puede pensar que no es la ubicación estándar para env lo que sólo puede agarrar un poco de información en relación con su ubicación:

  • /usr/bin/env - MacOS (10.12)
  • tanto /bin/env, /usr/bin/env - Fedora (25)

Estoy seguro de que otros podrán ampliar la lista.