Есть куча переменных окружения, на которые вы можете смотреть, но многие из них не обнаружат, если из 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 $$
. Это технически дает вам имя команды, в которой работает shell. В большинстве случаев это будет работать ... с тех пор, как приложения запускаются с некоторым вариантом системного вызова 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
.
Попробуйте это из bash, прежде чем полагаться на '$ SHELL':' csh -c 'echo "$ SHELL"' ' –
Мое впечатление о том, что скрипт должен знать оболочку входа. Используя bash в качестве оболочки входа, запуск этой команды должен вернуть bash, что и ожидается. – Jeff
Не оболочка входа. Если вы входите в систему, используйте bash, затем переключитесь на csh, $ SHELL останется bash, но 'source' будет терпеть неудачу. –