Intereting Posts

заголовок сценария оболочки для лучшей совместимости

Какая из них лучше:

  • #!/usr/bin/env sh
  • #!/bin/sh
  • пустой / без заголовка

Раньше я считал, что первый – лучший, так или иначе, я нашел в некоторых Linux-системах (например, Android), что путь отсутствует, поэтому теперь я думаю, что единственный способ иметь «переносные» сценарии оболочки – не включить любой заголовок …

Для переносимости вы можете с уверенностью предположить, что #!/bin/sh найдет в основном совместимую с POSIX оболочку в любой стандартной системе Unix или Linux, но это действительно так.

В FreeBSD, OpenBSD и NetBSD (наряду с DragonFly, PC-BSD и некоторыми другими производными) bash находится в /usr/local/bin/bash (если он установлен), поэтому подход /usr/bin/env обеспечивает переносимость между Linux и BSD.

Android не является стандартной системой Unix или Linux. На моем неуправляемом телефоне Android ни один из /usr/bin/env , /bin/bash или even /bin/sh существует, а системная оболочка – /system/bin/sh .

Скрипт оболочки, в котором отсутствует #! (shebang) попытается запустить в оболочке, которая вызвала его в некоторых системах, или может использовать другой интерпретатор по умолчанию (например, /bin/bash ), в других системах. И хотя это может работать в Android, не гарантируется работа в других операционных системах, где пользователи могут выбрать интерактивную оболочку, которая не является bash . (Я использую tcsh в FreeBSD, где это оболочка по умолчанию, а скрипт без скриптов интерпретируется вызывающей оболочкой).

Итак, откуда я сижу, похоже, что невозможно создать сценарий оболочки, который переносится между системами Android и не Android (Linux или Unix), потому что Android делает все по-другому.

По моему опыту, #!/bin/sh и #!/bin/bash всегда находили подходящую среду для нескольких систем, над которыми я работал. Мне еще предстоит встретить исключение. Я также считаю, что его обычно используют в сценариях, связанных с оболочкой, которые, как я полагаю, написаны, сохраняя мобильность в виду из-за различной аудитории.

Не могу сказать то же самое с #!/usr/bin/env . В некоторых системах он был установлен как #!/bin/env и в прошлом разбил мои скрипты python. Итак, я пойду со второй пулей.

Вот некоторая поддержка моего вышеприведенного утверждения:

В выпуске CentOS 5.7 я получаю следующее:

 $ which env /bin/env 

На Ubuntu 12.04 Точный панголин:

 $ which env /usr/bin/env 

Кроме того, по крайней мере, в одной более старой системе, я помню, что администраторы устанавливали coreutils в /opt по какой-либо причине (может быть, не лучшая практика). Поскольку env является частью coreutils , пользователи в конечном итоге получают его /opt/coreutils/bin/env . По общему признанию, я не использовал все системы там, поэтому ответ основывался на моем ограниченном опыте.