Существует множество переменных окружения, которые вы можете посмотреть, но многие из них не обнаружат, если из bash возникла другая оболочка.Рассмотрим следующее:
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:
Существует целый ряд переменных, специфичных для различных оболочек, за исключением того, что они имеют привычку наследоваться вложенными оболочками, и именно в этом случае среда действительно нарушается.Единственное, что почти работает, это ps -o command -p $$
.Технически это дает вам имя команды, под которой работает оболочка.В большинстве случаев это будет работать ... поскольку приложения запускаются с каким-либо вариантом системного вызова exec
, и это позволяет различать имя команды и исполняемого файла, возможно, что это также может дать сбой.Подумайте:
bash$ exec -a "-csh" bash
bash$ echo "$0, $SHELL, $BASH"
-csh, /bin/bash, /bin/bash
bash$ ps -o command -p $$
COMMAND
-csh
bash$
Еще один прием - использовать lsof -p $$ | awk '(NR==2) {print $1}'
.Вероятно, это настолько близко, насколько это возможно, если вам повезло иметь под рукой lsof
.