To niekoniecznie lepsze.
Zaletą #!/usr/bin/env python
jest to, że użyje dowolnego python
pliku wykonywalnego, który pojawi się jako pierwszy w użytkowniku $PATH
.
Wadą z #!/usr/bin/env python
jest to, że będzie używać cokolwiek python
wykonywalny pierwszy pojawia się w instrukcji $PATH
.
Oznacza to, że skrypt może zachowywać się inaczej w zależności od tego, kto go uruchamia. W przypadku jednego użytkownika może korzystać z /usr/bin/python
zainstalowanego z systemem operacyjnym. Po drugie, może użyć eksperymentu /home/phred/bin/python
, który nie działa poprawnie.
A jeśli python
jest zainstalowany tylko /usr/local/bin
użytkownik, który nie ma /usr/local/bin
na $PATH
nie nawet w stanie uruchomić skrypt. (Prawdopodobnie nie jest to zbyt prawdopodobne w nowoczesnych systemach, ale może się to zdarzyć w przypadku bardziej niejasnego tłumacza.)
Określając #!/usr/bin/python
, dokładnie określasz, który interpreter będzie używany do uruchomienia skryptu w określonym systemie .
Innym potencjalnym problemem jest to, że #!/usr/bin/env
sztuczka nie pozwala ci przekazywać argumentów do interentera (innych niż nazwa skryptu, która jest przekazywana niejawnie). To zwykle nie jest problemem, ale może być. Wiele skryptów Perla jest napisanych przy użyciu #!/usr/bin/perl -w
, ale obecnie use warnings;
jest to zalecany zamiennik. Skrypty #!/bin/csh -f
csh powinny być używane - ale skrypty csh nie są zalecane . Ale mogą być inne przykłady.
Mam wiele skryptów Perla w osobistym systemie kontroli źródła, które instaluję, kiedy zakładam konto w nowym systemie. Używam skryptu instalatora, który modyfikuje #!
wiersz każdego skryptu, gdy instaluje go w moim $HOME/bin
. (Nie musiałem używać niczego innego niż #!/usr/bin/perl
ostatnio; to sięga czasów, gdy Perl często nie był domyślnie instalowany).
Drobna uwaga: #!/usr/bin/env
sztuczka jest prawdopodobnie nadużyciem env
polecenia, które pierwotnie miało (jak sama nazwa wskazuje) wywoływać polecenie w zmienionym środowisku. Ponadto niektóre starsze systemy (w tym SunOS 4, jeśli dobrze pamiętam) nie miały tego env
polecenia /usr/bin
. Żaden z nich prawdopodobnie nie będzie stanowić poważnego problemu. env
działa w ten sposób, wiele skryptów używa tej #!/usr/bin/env
sztuczki, a dostawcy systemów operacyjnych prawdopodobnie nie zrobią nic, aby ją złamać. Może to być problem, jeśli chcesz, aby skrypt działał na naprawdę starym systemie, ale prawdopodobnie i tak będziesz musiał go zmodyfikować.
Innym możliwym problemem (dzięki Sopalajo de Arrierez za wskazanie tego w komentarzach) jest to, że zadania cron działają w ograniczonym środowisku. W szczególności $PATH
jest to zwykle coś w rodzaju /usr/bin:/bin
. Więc jeśli katalog zawierający interpreter nie znajduje się w jednym z tych katalogów, nawet jeśli jest domyślnie $PATH
w powłoce użytkownika, /usr/bin/env
sztuczka nie zadziała. Możesz podać dokładną ścieżkę lub dodać linię do swojego crontab, aby ustawić $PATH
( man 5 crontab
szczegółowe informacje).