wie man erkennt, ob es zsh oder bash verwendet




tcsh vs bash (4)

Ich habe eine Frage, wie Sie feststellen können, welche Shell der Benutzer verwendet. Nehmen Sie ein Skript an, das, wenn der Benutzer zsh verwendet, PATH in seine .zshrc und bei Verwendung von bash in .bashrc einfügt. Und rvmrc entsprechend einstellen.

#!/usr/bin/env bash
export PATH='/usr/local/bin:$PATH'" >> ~/.zshrc
source ~/.zshrc

Ich habe folgendes versucht, aber es funktioniert nicht: (

if [[ $0 == "bash ]]; then
  export PATH='/usr/local/bin:$PATH'" >> ~/.bashrc
elif [[ $0 == "zsh" ]]; then
  export PATH='/usr/local/bin:$PATH'" >> ~/.zshrc
fi

# ... more commands ...

if [[ $0 == "bash ]]; then
  [[ -s '/Users/`whoami`/.rvm/scripts/rvm' ]] && source '/Users/`whoami`/.rvm/scripts/rvm'" >> ~/.bashrc
  source ~/.bashrc
elif [[ $0 == "zsh" ]]; then
  [[ -s '/Users/`whoami`/.rvm/scripts/rvm' ]] && source '/Users/`whoami`/.rvm/scripts/rvm'" >> ~/.zshrc
  source ~/.zshrc
fi

Wenn die Shell Zsh ist, wird die Variable $ZSH_VERSION definiert. Ebenso für Bash und $BASH_VERSION .

if [ -n "$ZSH_VERSION" ]; then
   # assume Zsh
elif [ -n "$BASH_VERSION" ]; then
   # assume Bash
else
   # asume something else
fi

Diese Variablen sagen jedoch nur, welche Shell zum Ausführen des obigen Codes verwendet wird. Sie müssen dieses Fragment also in der Benutzer-Shell speichern.

Alternativ können Sie die Umgebungsvariable $SHELL (die den absoluten Pfad zur bevorzugten Shell des Benutzers enthalten sollte) verwenden und die Shell anhand des Werts dieser Variablen erraten:

case $SHELL in
*/zsh) 
   # assume Zsh
   ;;
*/bash)
   # assume Bash
   ;;
*)
   # assume something else
esac

Das obige wird natürlich fehlschlagen, wenn /bin/sh ein Symlink zu /bin/bash .

Wenn Sie sich auf $SHELL verlassen wollen, ist es sicherer, tatsächlich Code auszuführen:

if [ -n "`$SHELL -c 'echo $ZSH_VERSION'`" ]; then
   # assume Zsh
elif [ -n "`$SHELL -c 'echo $BASH_VERSION'`" ]; then
   # assume Bash
else
   # asume something else
fi

Dieser letzte Vorschlag kann von einem Skript aus ausgeführt werden, unabhängig davon, mit welcher Shell das Skript ausgeführt wird.


Eine Alternative funktioniert möglicherweise nicht für alle Schalen.

for x in $(ps -p $$)
do
  ans=$x
done
echo $ans

Ich hatte ein ähnliches Problem, entschied mich für:

_shell="$(ps -p $$ --no-headers -o comm=)"                                                                                                       
if [[ $_shell == "zsh" ]]; then                                                                                                                  
    read -q -s "?Do it?: "                                                                                                                    
fi                                                                                                                                               
elif [[ $_shell == "bash" || $_shell == "sh" ]]; then                                                                                              
    read -n 1 -s -p "Do it [y/n] "                                                                                                            
fi                                                                                                                                               

Geben Sie einfach $ 0 ein, es heißt -zsh, wenn es zsh ist, und -bash, wenn es bash ist

EDIT: Manchmal gibt es -zsh und manchmal zsh und dasselbe mit bash zurück, idk warum.





sh