Формальная перспектива
информативный раздел спецификации POSIX для
sh: использование приложения состояния
что вы не можете полагаться на исполняемый файл sh
, установленный на /bin/sh
.
Приложения должны учитывать, что стандарт PATH для оболочки не может быть
предполагается либо / bin / sh , либо / usr / bin / sh, и должно быть
определяется путем опроса PATH , возвращенного
getconf
PATH , гарантируя, что возвращаемый путь является абсолютным, а не
оболочка встроенная.
Например, чтобы определить местоположение стандартной утилиты sh:
command -v sh
Однако вместо предложения использовать env
для использования соответствующего PATH,
это предполагает, что сценарии оболочки должны быть изменены во время установки, чтобы использовать
полный путь к sh
:
Кроме того, в системах, которые поддерживают исполняемые скрипты («#!
»
конструировать), рекомендуется, чтобы приложения использовали исполняемые скрипты
установить их с помощью
getconf
PATH , чтобы определить путь к оболочке и обновить скрипт "#!
"
соответственно, как это устанавливается (например, с
1042 * СЭД *).
На практике
В основном я пишу сценарии оболочки POSIX и на практике каждую систему GNU / Linux
(На базе Red Hat и Debian) - и другие, такие как Cygwin и OS X - имеет
POSIX-совместимый sh
либо установлен на /bin/sh
, либо доступен в виде программного или
жесткая ссылка на этот путь. Мне никогда не нужно было использовать env
для обслуживания систем
где sh
не использует этот путь.
Могут быть некоторые системы Unix, где POSIX-совместимый sh
недоступен
как /bin/sh
. Спецификация POSIX предполагает, что он может быть установлен на
некоторые системы как /usr/xpg4/bin/sh
. Насколько я понимаю, это (было?) Правда
для систем Solaris, где /bin/sh
- более ранняя версия оболочки Bourne
который предшествует POSIX. В этом случае использование env sh
не гарантированно поможет, поскольку он все еще может найти оболочку Bourne (в /bin/sh
) перед оболочкой POSIX в /usr/xpg4/bin/sh
.
Резюме
Если вы пишете сценарии оболочки POSIX для обычных операционных систем Unix и Linux
системы, просто используйте #!/bin/sh
как shebang.
В редких случаях, когда /bin/sh
представляет собой оболочку Bourne вместо POSIX-совместимой
shell, вам придется изменить Shebang, чтобы использовать соответствующий полный путь
в оболочку POSIX.
В любом случае, использование #!/usr/bin/env sh
не имеет смысла - и будет
больше шансов потерпеть неудачу, чем просто использовать #!/bin/sh
.