Я бачив в ряді місць, в тому числі рекомендації на цьому сайті ( Що переважне Bash притон? ), Щоб використовувати #!/usr/bin/env bash
в перевазі #!/bin/bash
. Я навіть бачив, як один заповзятливий чоловік припускає, що використання #!/bin/bash
було неправильним, і функція bash була б втрачена тим самим.
Все, що сказано, я використовую bash у жорстко контрольованому тестовому середовищі, де кожен привід в обігу по суті є клоном одного головного приводу. Я розумію аргумент переносимості, хоча це не обов'язково застосовується в моєму випадку. Чи є якась інша причина віддавати перевагу #!/usr/bin/env bash
альтернативам, і, якщо припустити, що портативність викликає занепокоєння, чи є якась причина, коли її використання може порушити функціональність?
env
може не розміщуватися на /usr/bin
. Коментарі Shebang - це взагалі погана ідея IMHO. Якщо ваш інтерпретатор сценаріїв за замовчуванням не обробляє коментарі shebang, це лише коментар. Однак, якщо ви знаєте, що інтерпретатор скриптів може обробляти коментарі shebang, і ви знаєте шлях до баш, немає ніяких причин не викликати його, використовуючи його абсолютний шлях, якщо шлях занадто довгий (малоймовірний), або, можливо, ви зможете перенести скрипт до системи, яка не має 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
це вдасться.