Niedawno napisał patch do wersji GNU Coreutils z env
aby rozwiązać ten problem:
http://lists.gnu.org/archive/html/coreutils/2017-05/msg00018.html
Jeśli masz to, można zrobić:
#!/usr/bin/env :lang:--foo:bar
env
podzieli :lang:foo:--bar
w polach lang
, foo
i --bar
. Przeszuka ona PATH
dla interpretera lang
, a następnie wywoła go z argumentami --foo
, bar
oraz ścieżką do skryptu i argumentów tego skryptu.
Istnieje również funkcja przekazywania nazwy skryptu w środku opcji. Załóżmy, że chcesz uruchomić lang -f <thecriptname> other-arg
, a następnie pozostałe argumenty. Mając to poprawione env
, że odbywa się to tak:
#!/usr/bin/env :lang:-f:{}:other-arg
maksymalna po lewej stronie pola, które jest odpowiednikiem {}
otrzymuje z pierwszym argumentem, który następuje, które pod wezwaniem hash Wybuchu, to nazwa skryptu. Argument ten zostaje następnie usunięty.
Tutaj, other-arg
może być coś przetworzonego przez lang
lub coś przetworzonego przez skrypt.
Aby lepiej zrozumieć, zobacz liczne przypadki testowe echo
w łatce.
Wybrałem znak :
, ponieważ jest to istniejący separator używany w systemach PATH
w systemach POSIX. Ponieważ env
dokonuje wyszukiwania PATH
, jest mało prawdopodobne, aby było używane dla programu, którego nazwa zawiera dwukropek. Znacznik {}
pochodzi z narzędzia find
, które używa go do oznaczenia wstawienia ścieżki do linii poleceń -exec
.
Możesz rzucić okiem na to [pytanie SO] (http://stackoverflow.com/questions/881696/unbuffered-stdout-in-python-as-in-python--mrom-within-the-programu-), aby uzyskać trochę informacji o tym, jak wykonać niebuforowane wyjście. –