Comment tester quel shell j'utilise dans un terminal?

Comment vérifier quel shell j'utilise dans un terminal? Quel est le shell que j'utilise dans MacOS?

Plusieurs façons, du plus au less fiable (et le plus-à-less "lourd"):

  1. ps -p$$ -ocmd= . (Sous Solaris, il faudra peut-être utiliser fname au lieu de cmd .) Sous OSX et sur BSD, il faut utiliser la command au lieu de cmd .
  2. Vérifiez $BASH_VERSION , $ZSH_VERSION et d'autres variables spécifiques au shell.
  3. Vérifiez $SHELL ; c'est un dernier recours, car il spécifie votre shell par défaut et pas nécessairement le shell courant .

J'ai trouvé que les travaux suivants dans les quatre coquilles j'ai installé sur mon système (bash, tiret, zsh, csh):

 $ ps -p $$ 

Les opérations suivantes sur zsh, bash et tiret, mais pas sur csh:

 $ echo $0 

Comme la question request le shell utilisé et ne parle pas des arguments potentiels qui lui sont transmis, voici une façon d'éviter de les montrer:

 $ ps -o comm= -p $$ ksh93 

Remarque concernant certaines implémentations plus légères (téléphones Android, busybox, etc.): ps ne prend pas toujours en charge le commutateur -p , mais vous pouvez effectuer la search avec une command comme ps | grep "^$$ " ps | grep "^$$ " . (Cette regex grep identifiera de manière unique le PID, donc il n'y aura pas de faux positifs.

Un mélange de toutes les autres réponses, compatible avec Mac (comm), Solaris (fname) et Linux (cmd):

 ps -p$$ -o cmd="",comm="",fname="" 2>/dev/null | sed 's/^-//' | grep -oE '\w+' | head -n1 

Le pid de la coquille courante est donné par la variable $$ (dans la plupart des coquilles).

 whichsh="`ps -o pid,args| awk '$1=='"$$"'{print $2}'`" echo "$whichsh" 

Utilisation de backticks pour faire fonctionner jsh (Heirlomm shell).

Dans beaucoup de shells, le test direct de ps -o args= -p $$ fonctionne, mais busybox ash échoue là-dessus (résolu).

La vérification que $1 doit être égal à $$ supprime la plupart des faux positifs.

Le dernier ;: sont utilisés pour garder le shell en cours d'exécution pour ksh et zsh.

Les tests sur plus de systèmes vous aideront, s'il vous plaît faites un commentaire si cela ne fonctionne pas pour vous.

Ne fonctionne pas dans le type de coquilles csh .

J'ai mis $MYSHELL pour les prochains tests dans mon shell-agnostic ~/.aliases :

 unset MYSHELL if [ -n "$ZSH_VERSION" ] && type zstyle >/dev/null 2>&1; then # zsh MYSHELL=`command -v zsh` elif [ -x "$BASH" ] && shopt -q >/dev/null 2>&1; then # bash MYSHELL=`command -v bash` elif [ -x "$shell" ] && which setenv |grep builtin >/dev/null; then # tcsh echo "DANGER: this script is likely not compatible with C shells!" sleep 5 setenv MYSHELL "$shell" fi # verify if [ ! -x "$MYSHELL" ]; then MYSHELL=`command -v "$(ps $$ |awk 'NR == 2 { print $NF }')"` [ -x "$MYSHELL" ] || MYSHELL="${SHELL:-/bin/sh}" # default if verify fails fi 

La section tcsh est probablement imprudente de rouler dans un script de style POSIX car il est si radicalement différent (donc l'avertissement et pause de cinq secondes). (Pour un, les shells de style csh ne peuvent pas faire 2>/dev/null ou >&2 , comme indiqué dans le fameux rant de Csh Programming Considered Harmful .)

Il y a deux façons très simples:

  • À l'aide de la command ps :

     ps -o comm= $$ 

    ou

     ps -h -o comm -p $$ 

    où:

    • -h ou finissant toutes les options avec = pour ne montrer aucun en-tête.
    • -o comm pour ne montrer que le nom de base du process ( bash au lieu de /bin/bash ).
    • -p <PID> list uniquement le process avec la list de formulaire PID fournie.
  • Utilisation du système de pseudo-file d'information de process / proc :

     cat /proc/$$/comm 

    Cette option se comporte exactement comme la command ps ci-dessus.

    ou

     readlink /proc/$$/exe 

    Ce /proc/PID/exe lié au file en cours d'exécution, dans ce cas, dans / bin / bash, / bin / ksh, etc.

    Pour get uniquement le nom du shell, vous pouvez utiliser

     basename $(readlink /proc/$$/exe) 

    C'est la seule option qui donnera toujours le même résultat même si vous êtes dans un script, un code source ou un terminal en tant que liens vers le binary de l'interpréteur de shell utilisé.

    Attention Vous devez être conscient que cela montrera le binary final, donc ksh peut être lié à ksh93 ou sh à bash.

L'utilisation de /proc est vraiment utile via le /proc/self qui lie au PID de la comand actuelle.

Vous pouvez simplement utiliser la command echo $0 pour vérifier quel shell vous utilisez et <name_of_the_shell> --version pour vérifier la version du shell. (par exemple bash --version ).

 ps -p $$ | tail -n 1 | awk -F '\-' '{print $2}' 

Cela fonctionne aussi:

 env | grep SHELL