Pourquoi $ SHELL ne change pas lorsque j'exécute un nouveau shell?

14
 $ echo $SHELL
/bin/bash
 $ /bin/ksh93
 $ echo $SHELL
/bin/bash
 $ file /bin/ksh93
/bin/ksh93: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), 
dynamically linked (uses shared libs), for GNU/Linux 2.6.8, stripped

 $ getent passwd test111
test111:x:1008:1008:,,,:/tmp:/bin/ksh93
 $ ssh test@localhost
test@localhost's password:
 $ echo $SHELL
/bin/ksh93
 $ bash
 $ echo $SHELL
/bin/ksh93

Je m'attends $SHELLà ce que cela change après avoir exécuté un autre shell. Pourquoi pas?

PS Cependant, le shell change, seule la variable $ SHELL reste la même:

 $ dash
 $ echo $SHELL
/bin/bash
 $ T=test ; [[ $T = *est ]] && echo ok
dash: [[: not found
se ruer
la source
2
utiliser echo $0pour obtenir le shell actuel
Manula Waidyanatha

Réponses:

13

Vous ne devez pas vous attendre à ce que cette variable change. Il est utilisé pour stocker le chemin d'accès à votre shell par défaut, c'est-à-dire celui stocké dans la base de données de mots de passe, et non le shell que vous utilisez actuellement.

jlliagre
la source
8

SHELLest spécifié par POSIX . Citant:

SHELL Cette variable doit représenter un chemin d'accès de l'interpréteur de langage de commande préféré de l'utilisateur. [...]

L'exécution d'un shell différent n'indique pas nécessairement un changement dans les préférences de l'utilisateur.

Il est bon d'apprendre les types de choses que POSIX spécifie et où les rechercher car la plupart des systèmes * .nix visent la conformité POSIX. Les variables d'environnement sont l'une de ces choses.

Ciro Santilli 新疆 改造 中心 法轮功 六四 事件
la source
-3

La variable SHELL stocke le shell parent de votre session, qui correspond parfois à votre shell de connexion par défaut . $ SHELL est le shell parent qui a généré la session en cours.

donc, si j'utilise bash pour mon utilisateur et que chsh -s /bin/zsh userje le fais:, quand je le ferai echo $SHELL, le shell affiché sera toujours BASH.

voir cet article .

fromnaboo
la source
4
L'article auquel vous liez est incorrect. C'est l'inverse, c'est-à-dire que SHELL stocke votre shell de connexion par défaut (à la dernière connexion) qui correspond parfois à votre shell parent. Cette variable n'est jamais modifiée par votre parent ou votre shell actuel. La seule action qu'ils pourraient faire est de le définir si (de manière inattendue) non définie.
jlliagre