Cómo determinar el shell interactivo actual en el que estoy (línea de comandos)
¿Cómo puedo determinar el shell actual en el que estoy trabajando?
ps
¿Sería suficiente el resultado del comando por sí solo?
¿Cómo se puede hacer esto en diferentes versiones de Unix?
Hay tres métodos para encontrar el nombre del ejecutable del shell actual:
Tenga en cuenta que los tres enfoques pueden engañarse si el ejecutable del shell es
/bin/sh
, pero en realidad es un renombradobash
, por ejemplo (lo que sucede con frecuencia).Por lo tanto, su segunda pregunta sobre si
ps
la salida será suficiente se responde con " no siempre ".echo $0
- imprimirá el nombre del programa... que en el caso del shell es el shell real.ps -ef | grep $$ | grep -v grep
- esto buscará el ID del proceso actual en la lista de procesos en ejecución. Dado que el proceso actual es el shell, se incluirá.Esto no es 100% confiable, ya que es posible que tenga otros procesos cuyo
ps
listado incluya el mismo número que el ID del proceso del shell, especialmente si ese ID es un número pequeño (por ejemplo, si el PID del shell es "5", puede encontrar procesos llamados "java5" o "perl5" en la mismagrep
salida). Este es el segundo problema con el enfoque "ps", además de no poder confiar en el nombre del shell.echo $SHELL
- La ruta al shell actual se almacena comoSHELL
variable para cualquier shell. La advertencia para este caso es que si inicia un shell explícitamente como un subproceso (por ejemplo, no es su shell de inicio de sesión), obtendrá el valor de su shell de inicio de sesión. Si esa es una posibilidad, utilice el enfoqueps
o$0
.
- Sin embargo, si el ejecutable no coincide con su shell real (por ejemplo,
/bin/sh
en realidad es bash o ksh), necesita heurística. A continuación se muestran algunas variables ambientales específicas de varios shells:
$version
está configurado en tcsh$BASH
está configurado en bash$shell
(minúscula) se establece en el nombre real del shell en csh o tcsh$ZSH_NAME
está configurado en zshksh tiene
$PS3
y$PS4
establece, mientras que el shell Bourne normal (sh
) solo tiene$PS1
y$PS2
establece. En general, esto parece ser lo más difícil de distinguir: la única diferencia en todo el conjunto de variables de entorno entresh
yksh
que hemos instalado en Solaris boxen es$ERRNO
,$FCEDIT
,$LINENO
,$PPID
,$PS3
,$PS4
,$RANDOM
,$SECONDS
y$TMOUT
.
ACTUALIZACIÓN: Alguien mencionó " ash
" (Almquist Shell) en los comentarios. Parece que hay 2001 variantes que incluyen dash
; Entonces, con el fin de no ampliar la respuesta innecesariamente, aquí hay una página muy útil que enumera un montón de sabores diferentes ash
y sus diferencias entre sí y, a menudo, con el Bourne estándar sh
: https://www.in-ulm.de/~mascheck /varios/ceniza/
ps -p $$
debería funcionar en cualquier lugar donde las soluciones involucren ps -ef
y grep
funcionen (en cualquier variante de Unix que admita opciones POSIX paraps
) y no sufrirá los falsos positivos introducidos al buscar una secuencia de dígitos que pueden aparecer en otros lugares.
Úselo -p $$
para obtener información sobre el ID del proceso actual ( $$
) y -o
para controlar el formato de salida.
ps -p $$ -o 'comm='
o
ps -p $$ -o 'args='