En Terminal, ¿cómo puede determinar qué shell se está ejecutando realmente?

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 $SHELLdebe generar el shell al que se envía dicho comando. Entonces, ¿por qué obtengo esta salida después de cambiar de basha tcsh?

[<dir>] <username>$ tsch
[<dir>] <username>% echo $SHELL
/bin/bash
Try echo $0$SHELL está configurado en su .profile como una variable de entorno.
@Allan: echo $0solo me da una línea en blanco: no hay shells POSIX

Respuestas (4)

En cshshells familiares, obtendrá su shell en ejecución con este comando:

% echo $shell

Si cshse 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 $SHELLaú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 tcshsesión fue bash. Si bashse inicia con la SHELLvariable 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 fishromper. 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 $$))'
Correcto: pero según mi pregunta, ¿por qué se genera esto /bin/bashsi (supuestamente) he cambiado del valor predeterminado basha tcsh?
Respuesta actualizada. tcshno toca la SHELLvariable, por lo que si tiene un valor cuando tcshse inicia, permanece así.
La respuesta portátil publicada, ps -o comm= -p $$debería funcionar independientemente del shell, siempre que el shell se haya configurado correctamente $$, lo que tcshdebería funcionar.
Esa respuesta portátil falla en fish, así que creo que también es una respuesta única de POSIX
@Mark no, no es POSIX solo por el hecho de que funciona con csh, tcshy 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.
Funciona con peces y proporciona la ruta completa al execrable del caparazón, no solo el nombre del caparazón.
@Mark Answer actualizado para solucionarlo.
@jlliagre Realmente aprecio la respuesta completa que pusiste aquí. No me gusta la idea de cambiar después de haber aceptado una respuesta, pero en este caso, tu respuesta es la mejor.

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 $0devolverá 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

Ah, sí: entré echo $0y 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 tcshpara cambiar el valor predeterminado bashen lugar de cambiar el shell predeterminado en las preferencias de la Terminal a tcsh(o algún otro instalado) caparazón)?
@WatermarkBranding ejecutar tcsh desde la línea de comando es lo mismo que ejecutar como el shell predeterminado (excepto que Terminal lo llama como un shell de inicio de sesión)
Realmente aprecio su pronta respuesta (y una que ayudó a resolver el ejemplo que di). Dicho esto, con toda justicia, la respuesta de jllagre responde mejor a la pregunta. Voy a votar tu respuesta de todos modos. Mejor.

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 wcomando, descubrí que el usuario myuserinició sesión en console(ignore este) y también en s000.

Luego ejecuté ps -efy 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é tcshdesde 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, loginse 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