Я видел в нескольких местах, в том числе рекомендации на этом сайте ( что является предпочтительным 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/bashOpenBSD ничего не установлено . Шебанг #!/bin/bashволи будет ошибкой и #!/usr/bin/env bashбудет успешным.