Widziałem w wielu miejscach, w tym w zaleceniach na tej stronie ( jaki jest preferowany shebang Bash? ), Których należy używać #!/usr/bin/env bash
przed #!/bin/bash
. Widziałem nawet jedną przedsiębiorczą osobę, która sugerowała, że użycie #!/bin/bash
było złe i funkcjonalność basha zostałaby utracona.
To powiedziawszy, używam bash w ściśle kontrolowanym środowisku testowym, w którym każdy dysk w obiegu jest zasadniczo klonem pojedynczego dysku głównego. Rozumiem argument dotyczący przenośności, choć niekoniecznie ma on zastosowanie w moim przypadku. Czy istnieje jakikolwiek inny powód, aby preferować #!/usr/bin/env bash
alternatywne rozwiązania, a przy założeniu, że problemem była przenośność, czy istnieje jakiś powód, dla którego można by ją zepsuć?
env
może nie znajdować się w /usr/bin
. Komentarze Shebang są złym pomysłem IMHO. Jeśli domyślny interpreter skryptów nie obsługuje komentarzy shebang, jest to tylko komentarz. Jeśli jednak wiesz, że interpreter skryptu może obsłużyć komentarze shebang i znasz ścieżkę do bashu, nie ma powodu, aby nie wywoływać go przy użyciu jego ścieżki bezwzględnej, chyba że ścieżka jest za długa (mało prawdopodobna), lub możesz przenieść skrypt do systemu, w którym bash nie znajduje się w / bin. Z drugiej strony, wcześniej wspomniane zastrzeżenia mają zastosowanie w tym przypadku, ponieważ wiąże się z przenośnością.
/etc
lub /bin/sh
. bash
jest dodatkiem do większości systemów uniksowych. Tylko Linux bash
jest gwarantowany /bin
i najprawdopodobniej również jako /bin/sh
. Odkąd Linux stał się nowoczesnym de facto Uniksem dla wielu ludzi, zapomniano o istnieniu systemów innych niż Linux. W mojej własnej odpowiedzi poniżej założyłem Linuxa, ponieważ tak powiedziałeś bash
. Wiele urządzeń BSD, z którymi pracowałem, nawet nie ma zainstalowanych.
/bin/bash
. Bash nie jest domyślnie instalowany. Jeśli chcesz, musisz pkg install bash
. Po zainstalowaniu znajduje się pod adresem /usr/local/bin/bash
. Na /bin/bash
OpenBSD nie ma nic zainstalowanego . Szereg #!/bin/bash
woli popełni błąd i #!/usr/bin/env bash
odniesie sukces.