Es gibt eine Reihe von Umgebungsvariablen, die Sie betrachten können, aber viele von ihnen werden nicht erkennen, ob eine andere Shell von bash stammt. Beachten Sie Folgendes:
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:
Es gibt eine Reihe von Variablen, die spezifisch für die verschiedenen Schalen, außer dass sie eine Gewohnheit von Unterschalen vererbt das ist, wo wirklich die Umwelt, was bricht. Das einzige, was fast funktioniert, ist ps -o command -p $$
. Dies gibt Ihnen technisch den Befehlsnamen, unter dem die Shell läuft. In den meisten Fällen wird dies funktionieren ... da Anwendungen mit einer Variante des Systemaufrufs exec
gestartet werden und der Name des Befehls und der ausführbaren Datei sich unterscheiden können, ist es auch möglich, dass dies fehlschlägt. Bedenken Sie:
bash$ exec -a "-csh" bash
bash$ echo "$0, $SHELL, $BASH"
-csh, /bin/bash, /bin/bash
bash$ ps -o command -p $$
COMMAND
-csh
bash$
Ein weiterer Trick lsof -p $$ | awk '(NR==2) {print $1}'
zu verwenden ist. Dies ist wahrscheinlich so nah wie möglich, wenn Sie das Glück haben, lsof
handlich zu haben.
Probieren Sie dies innerhalb von bash, bevor Sie sich auf $ SHELL verlassen: 'csh -c 'echo" $ SHELL "'' –
Mein Eindruck der Frage ist, dass das Skript die Login-Shell kennen muss. Wenn Sie bash als Login-Shell verwenden, sollte der Befehl bash zurückgeben, was erwartet wird. – Jeff
Nicht die Login-Shell. Wenn Sie sich einloggen, benutzen Sie bash und ändern Sie dann in csh, $ SHELL ist bash, aber "source" würde fehlschlagen. –