As Richard Pennington says, właściwym sposobem na to jest mieć
#!/bin/bash
jako pierwszej linii skryptu.
Ale to nie pomoże, jeśli użytkownicy użyją go wyraźnie, używając sh
. Na przykład, jeśli podam
sh your-script-name
linia zostanie zignorowana.
Nie naprawdę może zapobiec ludzi od robienia tego, ale można go zniechęcić dodając coś takiego na początku skryptu:
#!/bin/bash
if [ ! "$BASH_VERSION" ] ; then
echo "Please do not use sh to run this script ($0), just execute it directly" 1>&2
exit 1
fi
Albo można zrobić coś takiego:
#!/bin/bash
if [ ! "$BASH_VERSION" ] ; then
exec /bin/bash "$0" "[email protected]"
fi
ale to może bardzo źle pójść; na przykład prawdopodobnie nie ma gwarancji, że $0
, która jest zwykle nazwą skryptu, jest w rzeczywistości nazwą, za pomocą której można go wywołać. Mogę sobie wyobrazić, że dzieje się to w nieskończonej pętli, jeśli źle zrobisz lub twój system jest nieco źle skonfigurowany.
Polecam podejście do komunikatu o błędzie.
(Uwaga: Właśnie edytować tę odpowiedź więc komunikat o błędzie zawiera nazwę skryptu, który może być pomocny dla użytkowników.)
@shellter: Myślę, że masz na myśli '/ usr/bin/env ', nie'/bin/env'; na przykład mój system nie ma '/ bin/env'. Zobacz także [to pytanie] (http://unix.stackexchange.com/q/29608/10454) i [moja odpowiedź] (http://unix.stackexchange.com/a/29620/10454). –
Uważam, że to pytanie jest przydatne i może nadal być zgodne z regułami, np. nie poza tematem, jeśli został zmieniony na "Jak mogę zmienić skrypt, aby wymusić jego wykonanie w bashu zamiast sh?" (prawie tak samo jak tytuł) – Programster