2012-04-03 15 views
15

Rozważmy następujący kod:shebang wskazując na skrypcie (także mając shebang) są skutecznie ignorowane

#!/usr/bin/env python 

import sys 

print "Hello! I've got %r as input." % sys.stdin.read() 

To chmod +x skrypt ed w /usr/local/bin/my_interpreter. I tak:

#!/usr/local/bin/my_interpreter 

This is intended to be passed "as is" to python script. 

Czy chmod +x skrypt ed, że stara się z niego skorzystać. Gdybym echo something | /usr/local/bin/my_interpreter, to działa dobrze, ale gdy próbuję wykonać skrypt powyżej, nie jest on z

/Users/modchan/test_interpreter/foo.bar: line 3: This: command not found 

Wydaje się, że jest cicho foo.bar przekierowany do bash zamiast mojego skryptu. Co ja robię źle? Jak to działa?

+1

Porównaj z http://unix.stackexchange.com/a/20895 – moodywoody

+0

@moodywoody, pytania imho to nie to samo, ale ten, który łączysz, jest dość pouczający. – toriningen

+0

Nie chciałem powiedzieć, że pytanie jest duplikatem - tylko, że drugi wątek ma charakter informacyjny. – moodywoody

Odpowiedz

11

Wygląda na Mac OS X wymaga tłumacza być binarny, a nie inny scenariusz. Aby to działało, zmień tłumacza Drugi skrypt do

#!/usr/bin/env /usr/local/bin/my_interpreter 

Ale masz drugi problem tutaj: zawartość drugiego scenariusza będzie nie przejść do stdin jej tłumacza, ale ścieżka skrypt będzie zostać przekazany jako argument wiersza poleceń, czyli

/usr/bin/env /usr/local/bin/my_interpreter /Users/modchan/test_interpreter/foo.bar 

powinien przeczytać plik wg nazwy sys.argv[1] zamiast z sys.stdin.

+1

Dzięki, przed twoją odpowiedzą próbowałem już używać '/ usr/bin/env my_interpreter', ale nie wiedziałem, że nazwa pliku idzie do argv zamiast stdin. – toriningen

3

Zależy to od programu ładującego system operacyjny, z którego korzystam, aby OS X był z twoich znaczników. Wiele systemów operacyjnych podobnych do UNIXa wymaga, aby interpreter shebang był skompilowanym plikiem wykonywalnym binarnym, a nie innym skryptem z innym shebangiem.

http://en.wikipedia.org/wiki/Shebang_(Unix)

Linux wspiera ten od 2.6.27.9, ale autor tego artykułu sugeruje, że prawdopodobnie nie każdy uniksach Berkeley pochodzi (który prawdopodobnie będzie zawierać OS X), które zrobić:

http://www.in-ulm.de/~mascheck/various/shebang/#interpreter-script

Jednym ze sposobów osiągnięcia tego, co chcesz byłoby coś takiego:

$!/bin/sh 
exec /usr/local/bin/my_interpreter <<EOM 

... content to be executed ... 
EOM 

Innym sposobem byłoby coś takiego:

$!/usr/bin/env /usr/local/bin/my_interpreter 
... content to be executed ... 
Powiązane problemy