На практике #!/usr/bin/env
является переносимым практически для любой системы, которая понимает #!
, Это полезная идиома для вызова программы, которая может быть где угодно в $PATH
. Если вы жестко запрограммировали путь к интерпретатору, ваш скрипт может не сработать, если вы скопируете его на другой компьютер.
Моя общая политика заключается в использовании #!/bin/sh
для сценариев, которые используют только переносимые функции sh
(т. е. только функции POSIX, если я забочусь только о современных единицах, и только функции Bourne, если я забочусь о более старых системах, таких как старые версии Solaris) и #!/usr/bin/env
противном случае.
Оборотная сторона #!/usr/bin/env
заключается в том, что он не позволяет передавать какие-либо параметры интерпретатору. С некоторыми интерпретаторами это можно обойти, указав вместо них параметры в качестве директив, или сделав вторую строку двухязыковым фрагментом, который вызывает интерпретатор при выполнении sh и ничего не делает при выполнении целевым интерпретатором. Например, есть распространенная идиома perl (полезно для передачи -T
).