comment dire si elle utilise zsh ou bash

j'ai une question sur comment dire quel shell l'utilisateur utilise. Supposons un script que si l'utilisateur utilise zsh, alors mettez chemin à son .zshrc et si l'utilisation de bash devrait mettre dedans .bashrc. Et régler rvmrc en conséquence.

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

j'ai essayé ce qui suit mais cela ne fonctionne pas: (

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

# ... more commands ...

if [[ "151910920" == "bash ]]; then
  [[ -s '/Users/`whoami`/.rvm/scripts/rvm' ]] && source '/Users/`whoami`/.rvm/scripts/rvm'" >> ~/.bashrc
  source ~/.bashrc
elif [[ "151910920" == "zsh" ]]; then
  [[ -s '/Users/`whoami`/.rvm/scripts/rvm' ]] && source '/Users/`whoami`/.rvm/scripts/rvm'" >> ~/.zshrc
  source ~/.zshrc
fi
41
demandé sur Juanito Fatas 2012-03-28 19:37:09

5 réponses

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" est ambigu. Votre tentative semble comme vous essayez de déterminer quel shell exécute votre script. Ce sera toujours ce que vous mettez dans la ligne #! du script, à moins que vous ne vouliez que vos utilisateurs éditent ce script, donc ce n'est pas utile pour vous.

ce que vous vouliez dire, je pense, c'est ce qu'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 . Si elle contient fish , zsh , bash , ksh ou tcsh , le shell préféré de l'utilisateur est probablement ce shell. Cependant, ce n'est pas la question pour votre problème.

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

le bon endroit pour définir une variable d'environnement est dans un fichier de démarrage de session. C'est surtout sans rapport avec l'utilisateur le choix de la coquille. Malheureusement, il n'y a pas de lieu unique pour définir les variables d'environnement. Sur beaucoup de systèmes, ~/.profile fonctionnera, mais ce n'est pas universelle. Voir https://unix.stackexchange.com/questions/4621/correctly-setting-environment et les autres postes que je lie à là pour une discussion plus longue.

24
répondu Gilles 2017-04-13 12:36:31

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 ne vous disent que quel shell est utilisé pour exécuter le code ci-dessus. Donc vous devez source ce fragment dans le shell de l'utilisateur.

comme alternative, vous pouvez utiliser la variable d'environnement $SHELL (qui devrait contenir le chemin absolu vers le shell préféré de l'utilisateur) et deviner le shell de la valeur de cette variable:

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

bien sûr, le ci-dessus échoue lorsque /bin/sh est un lien symbolique vers /bin/bash .

si vous voulez utiliser $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.

84
répondu adl 2012-08-11 08:30:29

just do echo $0 il 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.

31
répondu therealfarfetchd 2014-12-09 18:27:33

une alternative, pourrait ne pas fonctionner pour tous les coquillages.

for x in $(ps -p $$)
do
  ans=$x
done
echo $ans
2
répondu pizza 2012-03-29 01:17:10

moi-même ayant 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
répondu agathodaimon 2014-01-24 08:54:31