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
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.
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.
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.
Une alternative pourrait ne pas fonctionner pour tous les obus.
for x in $(ps -p $$)
do
ans=$x
done
echo $ans
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