Cómo determinar el shell interactivo actual en el que estoy (línea de comandos)

Resuelto josh asked hace 14 años • 29 respuestas

¿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?

josh avatar Jul 25 '10 04:07 josh
Aceptado
  • 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 renombrado bash, por ejemplo (lo que sucede con frecuencia).

    Por lo tanto, su segunda pregunta sobre si psla salida será suficiente se responde con " no siempre ".

    1. echo $0- imprimirá el nombre del programa... que en el caso del shell es el shell real.

    2. 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 pslistado 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 misma grepsalida). Este es el segundo problema con el enfoque "ps", además de no poder confiar en el nombre del shell.

    3. echo $SHELL- La ruta al shell actual se almacena como SHELLvariable 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 enfoque pso $0.


  • Sin embargo, si el ejecutable no coincide con su shell real (por ejemplo, /bin/shen realidad es bash o ksh), necesita heurística. A continuación se muestran algunas variables ambientales específicas de varios shells:
  • $versionestá configurado en tcsh

  • $BASHestá configurado en bash

  • $shell(minúscula) se establece en el nombre real del shell en csh o tcsh

  • $ZSH_NAMEestá configurado en zsh

  • ksh tiene $PS3y $PS4establece, mientras que el shell Bourne normal ( sh) solo tiene $PS1y $PS2establece. En general, esto parece ser lo más difícil de distinguir: la única diferencia en todo el conjunto de variables de entorno entre shy kshque hemos instalado en Solaris boxen es $ERRNO, $FCEDIT, $LINENO, $PPID, $PS3, $PS4, $RANDOM, $SECONDSy $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 ashy sus diferencias entre sí y, a menudo, con el Bourne estándar sh: https://www.in-ulm.de/~mascheck /varios/ceniza/

DVK avatar Jul 24 '2010 21:07 DVK

ps -p $$

debería funcionar en cualquier lugar donde las soluciones involucren ps -efy grepfuncionen (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.

Matthew Slattery avatar Jul 24 '2010 22:07 Matthew Slattery

Úselo -p $$para obtener información sobre el ID del proceso actual ( $$) y -opara controlar el formato de salida.

ps -p $$ -o 'comm='

o

ps -p $$ -o 'args='
Nahuel Fouilleul avatar Jun 19 '2012 08:06 Nahuel Fouilleul