Я видел в нескольких местах, в том числе рекомендации на этом сайте ( что является предпочтительным Bash Shebang? ), Чтобы использовать #!/usr/bin/env bash
в предпочтении #!/bin/bash
. Я даже видел, как один предприимчивый человек предположил, что использование #!/bin/bash
было неправильным, и функциональность bash была бы потеряна при этом.
Все это говорит о том, что я использую bash в жестко контролируемой тестовой среде, где каждый циркулирующий диск по сути является клоном одного главного диска. Я понимаю аргумент переносимости, хотя он не обязательно применим в моем случае. Есть ли какая-либо другая причина отдавать предпочтение #!/usr/bin/env bash
альтернативам, и, принимая во внимание переносимость, есть ли какая-либо причина, по которой она может нарушить функциональность?
env
может не находиться по адресу/usr/bin
. Комментарии Шебанга вообще плохая идея ИМХО. Если ваш интерпретатор сценариев по умолчанию не обрабатывает комментарии shebang, это просто комментарий. Однако, если вы знаете, что интерпретатор сценариев может обрабатывать комментарии shebang, и вы знаете путь к bash, нет причин не вызывать его, используя его абсолютный путь, если путь не слишком длинный (маловероятный) или вы, возможно, портируете скрипт в систему, в которой bash не находится в / bin. С другой стороны, оговорки, о которых я упоминал ранее, применимы в этом случае, поскольку они связаны с переносимостью./etc
или/bin/sh
.bash
является надстройкой для большинства Unix-подобных систем. Это только Linux, гдеbash
он гарантированно включен/bin
и, скорее всего, также связан как/bin/sh
. Поскольку Linux для многих стал де-факто современным Unix, тот факт, что системы, отличные от Linux, могут существовать, был забыт. В моем собственном ответе ниже я принял Linux, потому что вы сказалиbash
. У многих коробок BSD, с которыми я работал, даже не было установлено./bin/bash
. Bash не устанавливается по умолчанию. Если вы хотите этого, вы должныpkg install bash
. После установки он находится по адресу/usr/local/bin/bash
. На/bin/bash
OpenBSD ничего не установлено . Шебанг#!/bin/bash
воли будет ошибкой и#!/usr/bin/env bash
будет успешным.Ответы:
#!/usr/bin/env
поискPATH
поbash
, иbash
не всегда/bin
, особенно в системах , отличных от Linux. Например, в моей системе OpenBSD она включена/usr/local/bin
, поскольку она была установлена как дополнительный пакет.Если вы абсолютно уверены, что оно
bash
есть/bin
и будет всегда, нет ничего плохого в том, чтобы поместить это прямо в ваш шебанг, но я бы рекомендовал против этого, потому что у всех сценариев и программ есть жизни, превышающие то, что мы изначально считаем, что они будут иметь.источник
env
местоположения? POSIX не форсирует это./usr/lib/sendmail
(или, совсем недавно/usr/sbin/sendmail
) двоичного файла , доступного для обработки почты, в интересах Unix-подобной системы лучше всего это иметь,/usr/bin/env
потому что env shebang - такая распространенная практика. Это де-факто стандартный интерфейс.env
, но каким-то образом не иметь стандартное местоположение (которое может быть просто мягкой ссылкой)bash
. Не говоря уже о том, почему тогда hashbang не принимает просто#!bash
, а используетPATH
, вместо того, чтобы делать то же самое сenv
. Полагаю, не достаточно запутанным для новичков.This mostly works because the path /usr/bin/env is commonly used for the env utility
здесь en.wikipedia.org/wiki/Shebang_(Unix) - Мы должны доверять тому,env
чтобы быть «вероятно» во всех системах.env
была/bin
, а не/usr/bin
(не знаю какая, скорее всего SunOS 4). В эти дни это очень вероятно,/usr/bin/env
будет доступно, только из-за популярности#!/usr/bin/env
взлома.Стандартное расположение bash есть
/bin
, и я подозреваю, что это верно для всех систем. Однако что если вам не нравится эта версия bash? Например, я хочу использовать bash 4.2, но bash на моем Mac установлен на 3.2.5.Я мог бы попытаться переустановить Bash,
/bin
но это может быть плохой идеей. Если я обновлю свою ОС, она будет перезаписана.Тем не менее, я мог бы установить bash
/usr/local/bin/bash
и настроить мой PATH на:Теперь, если я
bash
укажу, я получаю не старый грубый/bin/bash
, а новый, более блестящий/usr/local/bin
. Ницца!За исключением того, что мои сценарии оболочки имеют этот
!# /bin/bash
шебанг. Таким образом, когда я запускаю свои сценарии оболочки, я получаю ту старую и паршивую версию bash, которая даже не имеет ассоциативных массивов.Использование
/usr/bin/env bash
будет использовать версию bash, найденную в моем PATH. Если я настрою свой PATH, чтобы/usr/local/bin/bash
он выполнялся, это будет bash, который будут использовать мои скрипты.Это редко можно увидеть в bash, но гораздо чаще встречается в Perl и Python:
/bin
?/usr/bin
?/opt/bin
? Кто знает? Использование#! /usr/bin/env perl
означало, что я не должен был знать.И теперь, почему вы не должны использовать
#! /usr/bin/env bash
Когда путь жестко запрограммирован в шебанге, я должен бежать с этим переводчиком. Таким образом,
#! /bin/bash
вынуждает меня использовать установленную по умолчанию версию bash. Поскольку возможности bash очень стабильны (попробуйте запустить версию Python 2.x под Python 3.x), очень маловероятно, что мой конкретный сценарий BASH не будет работать, и поскольку мой сценарий bash, вероятно, используется этой системой и другими системами Использование нестандартной версии bash может привести к нежелательным последствиям. Очень вероятно, что я хочу убедиться, что стабильная стандартная версия bash используется с моим сценарием оболочки. Таким образом, я, вероятно, хочу жестко прописать путь в моем шебанге.источник
Для вызова
bash
это немного излишним. Если у вас нет несколькихbash
двоичных файлов, подобных вашему, в ~ / bin, но это также означает, что ваш код зависит от $ PATH, в котором есть нужные вещи.Это удобно для таких вещей, как,
python
хотя. Существуют сценарии-оболочки и среды, которые приводят к использованию альтернативныхpython
двоичных файлов.Но ничто не потеряно при использовании точного пути к двоичному файлу, если вы уверены, что это именно тот двоичный файл, который вам действительно нужен.
источник
python
. Я потерял счет количества мест,python
которые можно найти 😀/usr/bin/env
это более полезно для Python, особенно если вы используете virtualenv.Есть много систем, в которых нет Bash
/bin
, FreeBSD и OpenBSD, и это лишь некоторые из них. Если ваш сценарий предназначен для переноса во многие разные Unices, вы можете использовать#!/usr/bin/env bash
вместо#!/bin/bash
.Обратите внимание, что это не относится к
sh
; для Bourne-совместимых скриптов я использовать исключительно#!/bin/sh
, так как я думаю , что почти каждый Unix существует имеетsh
в/bin
.источник
/bin
dir, я вижуsh -> dash
. Символически связано сdash
раскрытием природы Debian в Ubuntu. Запуск этих трех командных строк , чтобы понять , что все сводится к личным предпочтениям:which bash
тоwhich sh
потомwhich dash
.Я бы предпочел обернуть основную программу в скрипт, как показано ниже, чтобы проверить все
bash
доступные в системе. Лучше иметь больше контроля над версией, которую он использует.источник
определенно лучше, потому что он находит путь к исполняемому файлу bash из переменной системной среды.
Перейдите в свою оболочку Linux и введите
Он напечатает все ваши переменные окружения.
Перейдите к вашему сценарию оболочки и введите
Он напечатает ваш путь bash (в соответствии со списком переменных среды), который вы должны использовать для построения вашего правильного пути shebang в вашем скрипте.
источник