Hari ini, Anda biasanya dapat menemukan shell POSIX pada suatu sistem, dan dengan demikian umumnya berarti Anda dapat skrip dalam bahasa POSIX (modulo menjalankan bug kepatuhan).
Satu-satunya masalah adalah bahwa /bin/sh
kadang-kadang bukan shell POSIX. Dan Anda harus mengkodekan #!
baris menjadi skrip yang akan berperilaku sebagai executable yang bagus; Anda tidak bisa hanya meminta pengguna untuk meneliti masalah dan kemudian memanggil skrip Anda sebagai /path/to/posix/shell myscript
.
Jadi, caranya adalah dengan menggunakan fitur POSIX dalam skrip Anda, tetapi buat skrip tersebut secara otomatis menemukan shell POSIX. Salah satu cara untuk melakukannya adalah seperti ini:
#!/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.
Ada beberapa pendekatan lain, seperti pembuatan kode. Boostrap skrip Anda dengan skrip kecil yang mengambil badan file skrip tanpa #! baris, dan menambahkan satu.
Hal terburuk yang dapat Anda lakukan adalah mulai menulis seluruh skrip sedemikian rupa sehingga dijalankan pada cangkang Bourne mulai tahun 1981. Ini hanya diperlukan jika Anda harus menulis untuk sistem yang tidak benar-benar tidak memiliki cangkang lain. .