¿Por qué $ SHELL no cambia cuando ejecuto un nuevo 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

Espero que $SHELLcambie después de ejecutar otro shell. ¿Por qué no lo hace?

PD Sin embargo, el shell cambia, solo la variable $ SHELL permanece igual:

 $ dash
 $ echo $SHELL
/bin/bash
 $ T=test ; [[ $T = *est ]] && echo ok
dash: [[: not found
prisa
fuente
2
utilizar echo $0para obtener el shell actual
Manula Waidyanatha

Respuestas:

13

No debe esperar que esta variable cambie. Se utiliza para almacenar la ruta a su shell predeterminado, es decir, el que está almacenado en la base de datos de contraseñas, no el shell que está ejecutando actualmente.

jlliagre
fuente
8

SHELLestá especificado por POSIX . Citando:

SHELL Esta variable representará una ruta de acceso del intérprete de lenguaje de comando preferido del usuario. [...]

Ejecutar un shell diferente no indica necesariamente un cambio en la preferencia del usuario.

Es bueno aprender los tipos de cosas que POSIX especifica y dónde buscarlos, ya que la mayoría de los sistemas * .nix apuntan a cumplir con POSIX. Las variables de entorno son una de esas cosas.

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

La variable SHELL almacena el shell principal para su sesión, que a veces coincide con su shell de inicio de sesión predeterminado . $ SHELL es el shell principal que generó la sesión actual.

entonces, si uso bash para mi usuario y hago esto: chsh -s /bin/zsh usercuando lo haga echo $SHELL, el shell que se muestra seguirá siéndolo BASH.

ver este artículo .

fromnaboo
fuente
44
El artículo al que se vincula es incorrecto. Eso es al revés, es decir, SHELL almacena su shell de inicio de sesión predeterminado (en el último momento de inicio de sesión) que a veces coincide con su shell principal. Esta variable nunca es modificada por su shell principal o actual. La única acción que podrían hacer es configurarlo si (inesperadamente) se desarma.
jlliagre