Dzisiaj zwykle można znaleźć powłokę POSIX w systemie, co ogólnie oznacza, że możesz pisać w języku POSIX (moduł działa z błędami zgodności).
Jedynym problemem jest to, że /bin/sh
czasami nie jest powłoką POSIX. I musisz na stałe zakodować #!
wiersz w skryptach, które mają zachowywać się jak ładne pliki wykonywalne; nie możesz po prostu poprosić użytkownika o zbadanie problemu, a następnie wywołać skrypt jako /path/to/posix/shell myscript
.
Zatem sztuczka polega na użyciu funkcji POSIX w skrypcie, ale powoduje, że skrypt automatycznie znajdzie powłokę POSIX. Jednym ze sposobów na to jest:
#!/bin/sh
# At this point, we may be running under some old shell
# we have to tread carefully.
# note how we use test rather than [ ] syntax and avoid
# depending on test with no argument producing a failure;
# i.e. "test $posix_shell".
if ! test x$posix_shell = x ; then
# the three possible shell paths are just an example;
# please extend as necessary.
for shell in /usr/xpg4/bin/sh /bin/bash /usr/bin/bash ; do
if test -x $shell ; then
posix_shell=$shell
fi
done
if test x$posix_shell = x ; then
echo "no POSIX shell found"
exit 1
# or we could avoid bailing here and just fall back on /bin/sh:
# echo "falling back on /bin/sh: cross your fingers that it works"
# posix_shell=/bin/sh
fi
export posix_shell
# plain "$@" is broken in ancient shells!
# I seem to recall ${@+"$@"}: not sure if that's the right trick.
exec $posix_shell $0 ${@+"$@"} # can we count on exec in legacy shells?
fi
# phew, at this point in the script we have been re-executed and are
# being interpreted by some reasonably modern shell. We can use $(...)
# command substitution, and other features.
Istnieją inne podejścia, takie jak generowanie kodu. Zwiększ swoje skrypty za pomocą małego skryptu, który pobiera całe pliki skryptów bez znaku #! wiersz i dodaje jeden.
Najgorsze, co możesz zrobić, to zacząć pisać całe skrypty w taki sposób, aby działały na powłoce Bourne'a od 1981 roku. Jest to konieczne tylko wtedy, gdy musisz pisać dla systemu, który tak naprawdę nie ma żadnej innej powłoki .