2012-08-09 16 views
11

Czy jest możliwe określenie linii półokręgu bez znajomości ścieżki programu, który chcesz wykonać?Skrypt shella dla nieznanej ścieżki

może nie podać ścieżkę

#!node 

lub określić kilka opcji

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

Dodatkowe punkty do cross rozwiązania platformy (różne smaki Linux, BSD, OS X etc ...)

Odpowiedz

14

/usr/bin/env jest szczególnie uważany za rozwiązanie wieloplatformowe.

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. 

więc coś w linii:

#!/usr/bin/env node 

Będzie cross-platform i "prawo do zrobienia".

+0

+1 Rzeczywiście, jak na różne platformy. Niestety, POSIX nie określa, gdzie 'env' jest, ale muszę jeszcze znaleźć system, w którym nie ma go w'/usr/bin'. Ktoś widział funky OS, gdzie nie jest? – Jens

+0

Czy można przejść przez kilka programów połączonych razem w linię Shebang? ('! #/usr/bin/env cat | nl') –

+0

Nie, niemożliwe. Jeśli musisz, użyj osobnego skryptu. – Jens

-2

Połóż przestrzeń po shebangu. Jeśli program jest w zmiennej środowiskowej PATH, powinien przejść.

#! perl 

oczywiście przypadek szczególny dla Perl byłoby

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

To działa w systemie UNIX i OSX, nawet gdy nie ma/usr/bin/env jak zauważył @Jens

+0

nie działa dla mnie na OS X - ale dzięki –

-2

Nie używaj shebang.

node <<eof 
your node program here 
eof 
+0

@ the-guy-who-downvoted Dlaczego to nie jest dobry pomysł? –

+0

Nie jestem downvoter, ale to nawet nie odpowiada na twoje pytanie, a tym samym nie może rozwiązać twojego problemu. – Jens

+1

Działa na wszystkich systemach zgodnych z POSIX, możesz dodać opcje do polecenia i przekierować dane wyjściowe. Na Linuksie ten #!/usr/bin/env sh -x nie działa. – hipe

0

Wbrew temu, co ludzie mogą myśleć, że nie ma standardowego położenia env więc możemy tylko zdobędą informacje dotyczące jego położenie:

  • /usr/bin/env - MacOS (10,12)
  • zarówno /bin/env, /usr/bin/env - Fedora (25)

Jestem pewien, że inni będą mogli rozszerzyć listę.

Powiązane problemy