web-dev-qa-db-fra.com

comment savoir s'il utilise zsh ou bash

J'ai une question sur la façon de déterminer le shell utilisé par l'utilisateur. Supposons un script qui, si l'utilisateur utilise zsh, mette PATH à son .zshrc et, s'il utilise bash, mette le fichier .bashrc. Et définissez rvmrc en conséquence.

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

J'ai essayé ce qui suit mais ça ne marche pas: (

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
44
Juanito Fatas

Un mot d'avertissement: la question que vous semblez avoir posée, la question que vous vouliez poser et la question que vous auriez dû poser sont trois choses différentes.

«Quel Shell l’utilisateur utilise-t-il?» Est ambigu. Votre tentative semble indiquer que vous essayez de déterminer quel shell exécute votre script. Ce sera toujours ce que vous insérerez dans la ligne #! du script, à moins que vous ne vouliez que vos utilisateurs le modifient, ce qui ne vous sert à rien.

Je pense que ce que vous vouliez demander, c'est quel est le Shell préféré de l'utilisateur. Cela ne peut pas être déterminé de manière totalement fiable, mais vous pouvez couvrir la plupart des cas. Vérifiez la variable d'environnement Shell. S'il contient fish, zsh, bash, ksh ou tcsh, le shell préféré de l'utilisateur est probablement ce shell. Cependant, cette question ne convient pas à votre problème.

Des fichiers tels que .bashrc, .zshrc, .cshrc et ainsi de suite sont des fichiers d'initialisation du shell. Ils ne sont pas le bon endroit pour définir les variables d'environnement. Une variable d'environnement définie ne serait disponible que dans un terminal où l'utilisateur aurait lancé ce shell et non dans des programmes démarrés à partir d'une interface graphique. La définition remplacerait également toute personnalisation que l'utilisateur aurait pu effectuer dans une sous-session.

Le bon endroit pour définir une variable d'environnement est dans un fichier de démarrage de session. Cela n’a généralement aucun rapport avec le choix de l’utilisateur par Shell. Malheureusement, il n'y a pas de lieu unique pour définir les variables d'environnement. ~/.profile fonctionnera sur beaucoup de systèmes, mais ce n'est pas universel. Voir https://unix.stackexchange.com/questions/4621/correctly-setting-environment et les autres messages auxquels je vous renvoie pour une discussion plus longue.

25
Gilles

Si le shell est Zsh, la variable $ZSH_VERSION est définie. De même pour Bash et $BASH_VERSION.

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

Cependant, ces variables vous indiquent uniquement quel shell est utilisé pour exécuter le code ci-dessus. Il vous faudrait donc source ce fragment dans le shell de l'utilisateur.

Vous pouvez également utiliser la variable d'environnement $Shell (qui doit contenir le chemin absolu vers le shell préféré de l'utilisateur) et deviner le shell à partir de la valeur de cette variable:

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

Bien entendu, ce qui précède va échouer lorsque /bin/sh est un lien symbolique vers /bin/bash.

Si vous voulez vous fier à $Shell, il est plus sûr d'exécuter du code:

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

Cette dernière suggestion peut être exécutée à partir d'un script, quel que soit le shell utilisé pour exécuter le script.

90
adl

Faites juste echo $ 0 Il est dit -zsh si c'est zsh et -bash si c'est bash

EDIT: Parfois, il retourne -zsh et parfois zsh et la même chose avec bash, idk pourquoi.

35
therealfarfetchd

Une alternative pourrait ne pas fonctionner pour tous les obus.

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

J'ai moi-même un problème similaire, réglé pour:

_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                                                                                                                                               
0
agathodaimon