Hoje, geralmente você pode encontrar um shell POSIX em um sistema, e isso geralmente significa que você pode criar scripts na linguagem POSIX (módulo executando erros de conformidade).
O único problema é que /bin/sh
às vezes não é um shell POSIX. E você deve codificar a #!
linha em scripts que devem se comportar como bons executáveis; você não pode simplesmente pedir ao usuário para pesquisar o problema e depois chamar seu script como /path/to/posix/shell myscript
.
Portanto, o truque é usar os recursos POSIX em seu script, mas faça com que o script encontre automaticamente o shell POSIX. Uma maneira de fazer isso é assim:
#!/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.
Existem outras abordagens, como a geração de código. Inicie seus scripts com um pequeno script que ocupa um corpo de arquivos de script sem um #! linha e adiciona uma.
A pior coisa possível que você pode fazer é começar a escrever scripts inteiros de forma que sejam executados em um shell Bourne a partir de 1981. Isso é necessário apenas se você precisar escrever para um sistema que realmente não possui outro shell .