2012-08-09 11 views
11

È possibile specificare una riga shebang senza conoscere il percorso del programma che si desidera eseguire?Shebang di script shell per il percorso sconosciuto

forse non specificare il percorso

#!node 

o specificare diverse opzioni

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

Punti extra per una soluzione cross-platform (varie versioni di Linux, BSD, OSX ecc ...)

risposta

14

/usr/bin/env è specificamente pensato per soluzioni multipiattaforma.

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. 

quindi qualcosa in linee di:

#!/usr/bin/env node 

Will essere cross-platform e "la strada giusta da percorrere".

+0

+1 Come multipiattaforma come si arriva, anzi. Purtroppo, POSIX non specifica dove 'env' è, ma devo ancora trovare un sistema in cui non è in/usr/bin. Qualcuno ha visto un sistema operativo funky dove non lo è? – Jens

+0

è possibile passare attraverso diversi programmi collegati insieme nella linea shebang? ('! #/usr/bin/env cat | nl') –

+0

No, impossibile. Usa uno script separato se devi. – Jens

-2

Metti uno spazio dopo lo shebang. Se il programma è in PATH variabile d'ambiente, dovrebbe andare.

#! perl 

Certo, un caso speciale per Perl sarebbe

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

Questo funziona su Unix e OSX, anche quando non v'è/usr/bin/env come notato da @Jens

+0

non funziona per me su OSX - ma grazie –

-2

Non usare lo shebang.

node <<eof 
your node program here 
eof 
+0

@ the-guy-who-downvoted perché non è una buona idea? –

+0

Non sono il downvoter, ma questo non risolve nemmeno la tua domanda e quindi non può risolvere il tuo problema. – Jens

+1

Funziona su tutti i sistemi conformi a POSIX, è possibile aggiungere opzioni al comando e reindirizzare l'output. Su Linux questo #!/usr/bin/env sh -x non funziona. – hipe

0

Contrariamente a quanto si può pensare, non c'è posizione standard per env in modo che possiamo afferrare solo alcune informazioni per quanto riguarda la sua posizione:

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

Sono sicuro che altri saranno in grado di estendere l'elenco.