3.6.1. Detección de la shell

No hay un modo definitivo de conocer automáticamente qué shell está ejecutando nuestro script. Una muy buena aproximación es esta:

get_shell() {
   # local no funciona en ksh, así que la probamos por separado.
   [ -n "$KSH_VERSION" ] && [ -z "${KSH_VERSION##*Version AJM*}" ] && echo "ksh"

   # La implementación de ps que hace busybox no tiene opción -p.
   local exec="$(ps -p $$ -o command= 2>/dev/null | sed 's:^-\?\([^ ]\+\).*:\1:' || echo "busybox")"
   local shell=$(which "$exec")
   basename $(readlink -e "${shell:-$exec}")
}

que presupone que un fallo en la ejecución de ps significa que se está ejecutando la variante de busybox y, por tanto, la propia shell será la de busybox. En principio, el fallo se produce por carecer de la opción -p, que forma parte del estándar, por lo que normal es que cualquier implementación disponga de ella.