Hoy en día, generalmente puede encontrar un shell POSIX en un sistema, y eso generalmente significa que puede escribir en el lenguaje POSIX (módulo con errores de cumplimiento).
El único problema es que a /bin/sh
veces no es un shell POSIX. Y debe codificar la #!
línea en scripts que se comporten como buenos ejecutables; no puede simplemente pedirle al usuario que investigue el problema y luego invoque su script como /path/to/posix/shell myscript
.
Por lo tanto, el truco es utilizar las funciones POSIX en su script, pero hacer que el script encuentre automáticamente el shell POSIX. Una forma de hacerlo es así:
#!/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.
Existen otros enfoques, como la generación de código. Boostrap sus scripts con un pequeño script que toma un cuerpo de archivos de script sin un # línea, y agrega uno.
Lo peor que puede hacer es comenzar a escribir scripts completos de tal manera que se ejecuten en un shell Bourne desde 1981. Esto solo es necesario si debe escribir para un sistema que realmente no tiene ningún otro shell .