Al usar Terminal en OS X 10.11.4, al inicializar Terminal se abre una nueva ventana en ejecución bash
(de forma predeterminada). Según tengo entendido, la entrada echo $SHELL
debe generar el shell al que se envía dicho comando. Entonces, ¿por qué obtengo esta salida después de cambiar de bash
a tcsh
?
[<dir>] <username>$ tsch
[<dir>] <username>% echo $SHELL
/bin/bash
En csh
shells familiares, obtendrá su shell en ejecución con este comando:
% echo $shell
Si csh
se ejecutó, directa o indirectamente, desde un shell de la familia Bourne que tenía su variable SHELL exportada, siendo este último el caso común, la variable SHELL permanecería intacta, por lo que echo $SHELL
aún mostraría su valor anterior, lo que sería confuso.
Esto es lo que te está pasando, uno de los procesos padre de tu tcsh
sesión fue bash
. Si bash
se inicia con la SHELL
variable unset, la establece en la ruta a bash
, a pesar de lo que indique su documentación. Tenga en cuenta que el lanzamiento de una nueva familia de shell Bourne no habría cambiado la variable SHELL si se hubiera establecido. SHELL definitivamente no es la forma de identificar qué shell está ejecutando, solo para saber qué shell es su shell predeterminado cuando se encuentra en un entorno POSIX.
Una forma portátil de saber qué shell se está ejecutando actualmente sería:
ps -o comm= -p $$
Sin embargo, el último comando asume $$
que está configurado para el PID del proceso actual, que desafortunadamente, a algunos shells exóticos les gusta fish
romper. Una forma aún más portátil de solucionar este problema es:
env sh -c 'basename $(ps -o comm= -p $(ps -o ppid= -p $$))'
/bin/bash
si (supuestamente) he cambiado del valor predeterminado bash
a tcsh
?tcsh
no toca la SHELL
variable, por lo que si tiene un valor cuando tcsh
se inicia, permanece así.ps -o comm= -p $$
debería funcionar independientemente del shell, siempre que el shell se haya configurado correctamente $$
, lo que tcsh
debería funcionar.csh
, tcsh
y los gustos que notoriamente no son POSIX. Respuesta actualizada de todos modos con un comando que debería funcionar con muchos más shells, incluido fish
.Depende del shell en el que se esté ejecutando.
Si es un shell de confirmación POSIX, por ejemplo, bash, ash, ash, sh y algunos otros, por ejemplo, csh, tcsh, echo $0
devolverá el nombre del shell.
p.ej
~ $ bash
bash-3.2$ echo $0
bash
o
~ $ ksh
$ echo $0
ksh
Sin embargo, no todas las conchas son POSIX, por ejemplo, solía usar el perfil de concha de ipython y ahora pesco
echo $0
y obtuve el resultado esperado: tcsh
. Continuaré y aceptaré esta respuesta, ya que resuelve el ejemplo específico que di. Dicho esto, ¿sabe si tcsh
(o cualquier shell para el caso) se está ejecutando en algún tipo de estado "emulado" cuando uso tcsh
para cambiar el valor predeterminado bash
en lugar de cambiar el shell predeterminado en las preferencias de la Terminal a tcsh
(o algún otro instalado) caparazón)?Otra forma sería verificar a qué TTY está conectado su terminal y verificar qué shell se está ejecutando en ese tty. Luego, podría mirar el PID (ID de proceso) y el PPID (ID de proceso principal) en caso de que su shell haya generado otro shell como proceso secundario:
MacBook:~$ w
15:16 up 8 days, 16:11, 2 users, load averages: 1.26 1.22 1.24
USER TTY FROM LOGIN@ IDLE WHAT
myuser console - 19Apr16 8days -
myuser s000 - 15:15 - w
MacBook:~$ ps -ef | grep s000
UID PID PPID C STIME TTY TIME CMD
0 23865 293 0 3:15PM ttys000 0:00.14 login -pf myuser /bin/bash
501 23866 23865 0 3:15PM ttys000 0:00.05 -bash
0 23992 23866 0 3:16PM ttys000 0:00.01 ps -ef
501 23993 23866 0 3:16PM ttys000 0:00.00 grep s000
MacBook:~$
En el ejemplo anterior, usando el w
comando, descubrí que el usuario myuser
inició sesión en console
(ignore este) y también en s000
.
Luego ejecuté ps -ef
y solo mirando las columnas PID y PPID, puedo ver que login
(PID 23865) ha ejecutado bash
(PID 23866, PPID 23865), que luego ejecutó dos procesos: ps -ef
(PID 23992, PPID 23866) y grep s000
(PID 23993 PPID 23866 ).
Si, por alguna razón, ejecuté tcsh
desde bash
, ejecutar los comandos anteriores aún me permitiría ver qué shell ejecuta mi comando actual.
Cuando inicia una sesión de terminal en OS X, login
se llama a la utilidad.
De la página del manual:
The login utility enters information into the environment (see environ(7)) specifying the user's home directory (HOME), command inter-
preter (SHELL), search path (PATH), terminal type (TERM) and user name (both LOGNAME and USER).
Some shells may provide a builtin login command which is similar or identical to this utility. Consult the builtin(1) manual page.
Tenga en cuenta las opciones utilizadas cuando se llama a la utilidad y luego lea la página del manual:
ps -ef | grep -w [l]ogin
Parte de esta información se obtuvo de su registro en opendirectory.
dscl . -read /Users/your_user_name RecordName UserShell NFSHomeDirectory
Alano
echo $0
$SHELL está configurado en su .profile como una variable de entorno.mmmmmm
echo $0
solo me da una línea en blanco: no hay shells POSIX