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

2

Al usar Terminal en OS X 10.11.4, al inicializar Terminal se abre una nueva ventana que ejecuta bash (por defecto) Como lo entiendo, ingresar echo $SHELL debería 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
    
pregunta JDQ 28.04.2016 - 00:49

4 respuestas

4

Bajo csh family shells, obtendrás tu shell en ejecución con este comando:

% echo $shell

Si csh se ejecutó, directa o indirectamente, desde un shell de la familia Bourne a la que se exportó su variable SHELL, siendo este último el caso común, la variable SHELL permanecerá intacta, por lo que echo $SHELL seguirá mostrando su valor anterior lo que sería confuso.

Esto es lo que te está sucediendo, uno de los procesos principales de tu sesión tcsh fue bash . Si bash se inicia con la variable SHELL sin establecer, la establece en la ruta a bash , a pesar de lo que indica la documentación. Tenga en cuenta que lanzar una nueva familia de shell Bourne no habría cambiado la variable SHELL si se configurara. Definitivamente, SHELL no es la forma de identificar qué shell está ejecutando, solo para saber qué shell es su shell predeterminado 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 $$ se establece en el PID del proceso actual, que desafortunadamente, algunos shells exóticos como fish se rompen. Una forma aún más portátil que soluciona este problema es:

env sh -c 'basename $(ps -o comm= -p $(ps -o ppid= -p $$))'
    
respondido por el jlliagre 28.04.2016 - 01:20
4

Depende del shell en el que estés ejecutando.

Si es un shell de confirmación POSIX, p. ej. bash, ash, ash, sh, y algunos más, por ejemplo. csh, tcsh entonces echo $0 devolverá el nombre del shell

por ejemplo

~ $ bash
bash-3.2$ echo $0
bash

o

~ $ ksh
$ echo $0
ksh

Sin embargo, no todas las carcasas son POSIX, p. Solía usar el perfil de shell ipython y ahora pesco

    
respondido por el Mark 28.04.2016 - 01:05
2

Otra forma sería verificar a qué TTY está conectado tu terminal y qué shell se está ejecutando en ese tty. Luego, puede ver el PID (ID del proceso) y el PPID (ID del proceso primario) en caso de que su shell haya generado otro shell como un 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, al usar el comando w , descubrí que el usuario myuser está conectado al console (ignore este) y también a 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 algún motivo, ejecuté tcsh desde bash , la ejecución de los comandos anteriores aún me permitiría ver en qué shell se ejecuta mi comando actual.

    
respondido por el mike 28.04.2016 - 17:22
1

Cuando inicias una sesión de terminal en OS X, se llama a la utilidad login .

Desde 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.

Observe las opciones que se usan cuando se llama a la utilidad, 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
    
respondido por el fd0 28.04.2016 - 17:01

Lea otras preguntas en las etiquetas