To niekoniecznie lepsze.
Zaletą #!/usr/bin/env pythonjest to, że użyje dowolnego pythonpliku wykonywalnego, który pojawi się jako pierwszy w użytkowniku $PATH.
Wadą z #!/usr/bin/env pythonjest to, że będzie używać cokolwiek pythonwykonywalny 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/pythonzainstalowanego z systemem operacyjnym. Po drugie, może użyć eksperymentu /home/phred/bin/python, który nie działa poprawnie.
A jeśli pythonjest zainstalowany tylko /usr/local/binużytkownik, który nie ma /usr/local/binna $PATHnie 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/envsztuczka 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 -fcsh 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/perlostatnio; to sięga czasów, gdy Perl często nie był domyślnie instalowany).
Drobna uwaga: #!/usr/bin/envsztuczka jest prawdopodobnie nadużyciem envpolecenia, 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 envpolecenia /usr/bin. Żaden z nich prawdopodobnie nie będzie stanowić poważnego problemu. envdziała w ten sposób, wiele skryptów używa tej #!/usr/bin/envsztuczki, 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 $PATHjest 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 $PATHw powłoce użytkownika, /usr/bin/envsztuczka nie zadziała. Możesz podać dokładną ścieżkę lub dodać linię do swojego crontab, aby ustawić $PATH( man 5 crontabszczegółowe informacje).