Hay un montón de variables de entorno que puede ver, pero muchas de ellas no detectarán si se genera un shell diferente de bash. Considere lo siguiente:
bash$ echo "SHELL: $SHELL, shell: $shell, ARGV[0]: $0, PS1: $PS1, prompt: $prompt"
SHELL: /bin/bash, shell: , ARGV[0]: -bash, PS1: bash$ , prompt:
bash$ csh
[lorien:~] daveshawley% echo "SHELL: $SHELL, shell: $shell, \$0: $0, PS1: $PS1, prompt: $prompt"
SHELL: /bin/bash, shell: /bin/tcsh, ARGV[0]: csh, PS1: bash$ , prompt: [%m:%c3] %n%#
[lorien:~] daveshawley% bash -r
bash$ echo "SHELL: $SHELL, shell: $shell, ARGV[0]: $0, PS1: $PS1, prompt: $prompt"
SHELL: /bin/bash, shell: , ARGV[0]: sh, PS1: bash$ , prompt:
bash$ zsh
% echo "SHELL: $SHELL, shell: $shell, ARGV[0]: $0, PS1: $PS1, prompt: $prompt"
SHELL: /bin/bash, shell: , ARGV[0]: zsh, PS1: % , prompt: %
% ksh
$ echo "SHELL: $SHELL, shell: $shell, ARGV[0]: $0, PS1: $PS1, prompt: $prompt"
SHELL: /bin/bash, shell: , ARGV[0]: ksh, PS1: bash$ , prompt:
Hay una serie de variables específicas para las distintas conchas excepto que tienen un hábito de ser heredado por sub-proyectiles, que es donde la cosa entorno realmente rompe. Lo único que casi funciona es ps -o command -p $$
. Esto técnicamente le proporciona el nombre de comando con el que se ejecuta el shell. En la mayoría de los casos, esto funcionará ... ya que las aplicaciones se inician con alguna variante de la llamada al sistema exec
y permite que el nombre del comando y el ejecutable difieran, también es posible que esto falle. Considere lo siguiente:
bash$ exec -a "-csh" bash
bash$ echo "$0, $SHELL, $BASH"
-csh, /bin/bash, /bin/bash
bash$ ps -o command -p $$
COMMAND
-csh
bash$
Otro truco es usar lsof -p $$ | awk '(NR==2) {print $1}'
. Esto es probablemente lo más cercano que pueda obtener si tiene la suerte de tener lsof
a mano.
Pruebe esto dentro de bash antes de confiar en '$ SHELL':' csh -c 'echo "$ SHELL"' ' –
Mi impresión de la pregunta es que el script necesita saber el shell de inicio de sesión. Usando bash como shell de inicio de sesión, ejecutar ese comando debería devolver bash, lo cual se espera. – Jeff
No es el shell de inicio de sesión. Si inicia sesión use bash y cambie a csh, $ SHELL permanecerá bash, pero 'source' fallará. –