Comment vérifier le shell que j'utilise?

359

J'ai lu que le terminal n'est rien d'autre qu'un shell, et Unix fournit différentes saveurs de shell:

  • Bourne shell (sh)
  • C shell (csh)
  • Shell TC (tcsh)
  • Korn shell (ksh)
  • Bourne Again shell (bash)

Des questions:

  • Lorsque j'ouvre une fenêtre de terminal, quel shell est ouvert par défaut?
  • Comment vérifier le nombre de coques installées?
  • Comment changer le shell utilisé depuis mon compte?
LearNer969
la source
@KasiyA Ceci est également lié à askubuntu.com/questions/87853/…
daisy
Veuillez noter que le terminal est une interface avec le shell (autrefois une interface physique) et que le shell n’est pas un terminal - c’est un interpréteur de commandes. Voir aussi askubuntu.com/a/640105/295286
Sergiy Kolodyazhnyy

Réponses:

429

Vous pouvez taper la commande suivante dans votre terminal pour voir quel shell vous utilisez:

echo $0

Le résultat ressemblera à celui ci-dessous si vous utilisez le terminal bash ( Bourne Again Shell ):

-bash
Kingmilo
la source
2
est 0une variable d'environnement?
Mi_Onim
43
@Mi_Onim $ 0 est le nom du processus en cours d'exécution. Si vous l'utilisez à l'intérieur d'un shell, il renverra le nom du shell. Si vous l'utilisez dans un script, ce sera le nom du script.
kingmilo
2
NOTE : cela ne fonctionnera pas pour interactif csh. % echo $0 No file for $0., mais ça marche pourtcsh
Sergiy Kolodyazhnyy
2
Ne fonctionne pas si quand on est un lien symbolique. Comme bashcommesh
Anwar
9
@Anwar fait un bon point, après avoir obtenu le nom du shell echo $0, ls -l `which <name>` pour voir s'il est lié de manière symétrique à un autre fichier binaire du shell.
JivanAmara
121

Pour trouver le shell que vous avez sur l'environnement par défaut, vous pouvez vérifier la valeur de la SHELLvariable d'environnement:

echo $SHELL

Pour rechercher l'instance de shell actuelle, recherchez le processus (shell) ayant le PID de l'instance de shell actuelle.

Pour trouver le PID de l'instance actuelle du shell:

echo "$$"

Maintenant, pour trouver le processus ayant le PID:

ps -p <PID>

Mettre ensemble:

ps -p "$$"
heemayl
la source
27
$ SHELL est le shell par défaut du système (ou de l'utilisateur), qui est généralement (mais pas nécessairement) le shell réellement utilisé à un moment donné.
kingmilo
1
@kingmilo: C'est ça, réponse modifiée.
Heemayl
J'ai trouvé cela très utile lors du passage à un utilisateur via 'su - <nom d'utilisateur>', par exemple pour configurer postgres, jenkins, ...
bully
1
echo $SHELLm'a donné /bin/cshet ps -p $$m'a donné 22673 pts/1 00:00:00 bash. Kingmilo a expliqué (ci-dessus) pourquoi ils ne sont pas identiques.
18446744073709551615
@ 18446744073709551615 Je n'ai pas dit non plus qu'ils sont les mêmes. Veuillez relire attentivement la réponse. notez les libellés par défaut et actuels .
Heemayl
25

$SHELLvous donne le shell par défaut. $0vous donne le shell actuel.

Par exemple: bash est mon shell par défaut que j'utilise pour mon application Terminal. Mais pour mon application iTerm2, j'utilise la commande que la fenêtre s'ouvre: /bin/ksh.

Donc, ma $0donne moi /bin/kshsur iTerm2. $SHELLme donne /bin/bashsur iTerm2. $0, $SHELLme donne /bin/bashsur le terminal

thenakulchawla
la source
2
C'est une bonne désambiguïsation des autres réponses les plus votées. Je vous remercie.
Michael Hoffmann
Pour moi, zsh est installé et il s’agit de la valeur par défaut actuelle. Pour basculer sur bash, il suffit de taper bashle terminal. Pour revenir à zsh, tapezzsh
Yousuf Azad
8

Pour savoir quel est le shell par défaut pour votre utilisateur, vous pouvez exécuter:

echo "$SHELL"

Par exemple, si vous utilisez Bash, vous devriez obtenir le résultat suivant:

/bin/bash

Si vous n'avez modifié aucune configuration, il devrait s'agir de Bash, car c'est le shell par défaut sous Ubuntu.

kos
la source
/ bin / sh est le langage de commande Shell et non le bourne Shell. Veuillez éditer votre réponse.
kingmilo
@kingmilo Il n'y a pas de /bin/shréférence dans ma réponse
kos
@kol il y avait avant éditer. Veuillez également noter que $ SHELL est le shell par défaut du système (ou de l'utilisateur), qui est généralement (mais pas nécessairement) le shell réellement utilisé à un moment donné.
kingmilo
1
@kingmilo En relisant la réponse, je pense comprendre ce qui vous préoccupe, probablement que je ne me suis pas bien exprimé. J'ai clarifié le sens de "actuellement" dans ma réponse
kos
1
@frederickjh le poisson est un peu étrange ici. La $$variable est en réalité définie par POSIX et fonctionnera sur la grande majorité des coques. Fish a décidé de ne pas suivre la norme ici, alors je pense qu'il est juste de l'ignorer. Je peux confirmer que cela $$fonctionne comme prévu dans sh, dash, bash, zsh, ksh, ash, tcsh et csh. En fait, de mémoire, je ne peux penser à aucune autre coquille à l’exception du poisson où cela ne fonctionne pas.
terdon
8

Les autres réponses utilisent généralement des fonctionnalités spécifiques au shell, mais nous essayons de déterminer quel shell nous utilisons, elles supposent donc la réponse au problème. Par exemple, aucune des réponses ne fonctionnera sur le poisson.

sh -c 'ps -p $$ -o ppid=' | xargs ps -o comm= -p

À la place, utilisez la syntaxe $$ dans un appel de sh, mais nous recherchons alors le PPID et non le PID. Utilisez le PPID pour trouver le cmd.

sh -c 'ps -p $$ -o ppid=' | xargs -I'{}' readlink -f '/proc/{}/exe'

Merci pour l'amélioration @muru

Evan Benn
la source
2
Vous pouvez utiliser ppid=/ cmd=pour omettre les en-têtes (et donc le tail -1s), et envisager de regarder /proc/.../exequel fichier est en cours d’exécution (puisque la cmdsortie peut être manipulée par tout ce qui a été exécuté par le shell).
Muru
1
Apparemment, cela ne fonctionne pas dans busybox, pour des raisons de non-conformité: ref: github.com/broadinstitute/cromwell/pull/…
Evan Benn
4

Le message original posait trois questions. Les réponses données couvrent la première question, "Quand j'ouvre une fenêtre de terminal, quel shell est ouvert par défaut?" Ils répondent également à une question qui N'A PAS été posée, à savoir "Comment puis-je savoir quel shell est en cours d'exécution dans le terminal?" Toutefois, pour autant que je sache, personne n’a répondu à la deuxième ou à la troisième question posée à l’origine, à savoir: "Comment puis-je vérifier le nombre de réservoirs installés?" et "Comment changer le shell utilisé depuis mon compte?"

  • Pour répondre "Comment puis-je vérifier le nombre de coques installées?" la commande suivante listera tous les shells disponibles:

chat / etc / coquilles

Par exemple, sur une installation par défaut d’Ubuntu 18.10, ceci donne:

# / etc / shells: shells de connexion valides

/ bin / sh

/ bin / dash

/ bin / bash

/ bin / rbash

Cependant, par défaut, sh est un lien symbolique vers dash, tandis que rbash se connecte à bash avec l'option -r ("restricted bash"), de sorte qu'il n'y a en réalité que deux shells, et non quatre comme le suggère la liste ci-dessus. La commande suivante vous montrera si l'un des shells listés est en fait un lien symbolique et, le cas échéant, à quel lien: ls -l / bin

Michael D
la source