tcsh vs bash




wie man erkennt, ob es zsh oder bash verwendet (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

Ein Wort der Warnung: Die Frage, die Sie scheinbar gestellt haben, die Frage, die Sie stellen wollten, und die Frage, die Sie hätten stellen sollen, sind drei verschiedene Dinge.

"Welche Shell der Benutzer verwendet" ist mehrdeutig. Ihr Versuch sieht so aus, als würden Sie versuchen herauszufinden, welche Shell Ihr Skript ausführt. Das wird immer das sein, was Sie in das #! Zeile des Skripts, es sei denn, Sie wollten, dass Ihre Benutzer das Skript bearbeiten, und das ist für Sie nicht nützlich.

Ich denke, Sie wollten fragen, was die Lieblings-Shell des Benutzers ist. Dies kann nicht völlig zuverlässig ermittelt werden, aber Sie können die meisten Fälle abdecken. Überprüfen Sie die Umgebungsvariable SHELL . Wenn es fish , zsh , bash , ksh oder tcsh , ist die bevorzugte Shell des Benutzers wahrscheinlich diese Shell. Dies ist jedoch die falsche Frage für Ihr Problem.

Dateien wie .bashrc , .zshrc , .cshrc usw. sind Shell-Initialisierungsdateien. Sie sind nicht der richtige Ort, um Umgebungsvariablen zu definieren. Eine dort definierte Umgebungsvariable wäre nur in einem Terminal verfügbar, an dem der Benutzer diese Shell gestartet hat, und nicht in Programmen, die über eine GUI gestartet wurden. Die Definition würde auch alle Anpassungen überschreiben, die der Benutzer möglicherweise in einer Subsession vorgenommen hat.

Der richtige Ort zum Definieren einer Umgebungsvariablen befindet sich in einer Sitzungsstartdatei. Dies hat meistens nichts mit der Shell-Wahl des Benutzers zu tun. Leider gibt es keine einzige Stelle, um Umgebungsvariablen zu definieren. Auf vielen Systemen funktioniert ~/.profile , aber das ist nicht universell. Siehe https://unix.stackexchange.com/questions/4621/correctly-setting-environment und die anderen Posts, auf die ich dort verlinkt, für eine längere Diskussion.


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                                                                                                                                               

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.





sh