Bugün, genellikle bir sistemde bir POSIX kabuğu bulabilirsiniz ve bu genel olarak POSIX dilinde kod yazabileceğiniz anlamına gelir (modulo uyumluluk hatalarına koşar).
Tek sorun, /bin/sh
bazen bir POSIX kabuğu olmamasıdır. Ve #!
satırı, çalıştırılabilir dosyalar kadar iyi davranacak komut dosyalarına kodlamanız gerekir ; kullanıcıdan sadece sorunu araştırmasını ve komut dosyanızı şu şekilde çağırmasını isteyemezsiniz /path/to/posix/shell myscript
.
Bu yüzden hile, betiğinizde POSIX özelliklerini kullanmak, ancak betiğin POSIX kabuğunu otomatik olarak bulmasını sağlamaktır. Bunu yapmanın bir yolu şöyle:
#!/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.
Kod oluşturma gibi başka yaklaşımlar da var. Komut dosyalarınızı bir # olmadan komut dosyası dosyalarını alan küçük bir komut dosyası ile güçlendirin! çizgi ve bir tane ekler.
Yapabileceğiniz en kötü şey, tüm betikleri 1981'den itibaren bir Bourne kabuğu üzerinde çalışacak şekilde yazmaya başlamaktır. Bu, yalnızca gerçekten başka bir kabuğu olmayan bir sistem için yazmanız gerektiğinde gereklidir. .