Según mi conocimiento, para determinar el shell actual que usamos echo $0en el shell. Más bien quiero que mi script verifique en qué shell se está ejecutando. Entonces, intenté imprimir $0en el script y me devuelve el nombre del script como debería. Entonces, mi pregunta es ¿cómo puedo encontrar en qué shell se ejecuta mi script durante el tiempo de ejecución?
22

echo $0No es una opción aquí, ya que el script se ejecutará en muchas máquinas diferentes, donde lo primero que tendré que verificar es el shell.#! /bin/sh -en la parte superior, se ejecutarásh. ¿Te refieres a qué varianteshes?Respuestas:
En Linux puedes usar
/proc/PID/exe.Ejemplo:
fuente
/bin/sed -r -e 's/\x0.*//' /proc/$$/cmdlineda zsh o ksh en su lugar. (Eso sería $ 0 si los shells no arreglaran esto mágicamente para dar el nombre de los scripts)./proces tan feo e inportable como se pone./procno es "feo"/procA menudo es una solución muy elegante. Inportable sí, pero porque algo no es portátil no lo hace feo./procfeo porque los archivos que contiene pueden ir y venir a voluntad de los desarrolladores y el contenido de los archivos es propenso a cambiar sin previo aviso, lo que causa un dolor infinito debido a los formatos de archivos bitrot y de destino.Tal vez no sea lo que está pidiendo, pero esto debería funcionar hasta cierto punto para identificar al intérprete que actualmente lo interpreta para algunos como Thompson (osh), Bourne, Bourne-again (bash), Korn (ksh88, ksh93, pdksh, mksh ), zsh, ordinario que cumple con las políticas (posh), Yet Another (yash), rc, akanga, es shells, wish, tclsh, expect, perl, python, ruby, php, JavaScript (nodejs, SpiderMonkey shell y JSPL al menos) , MS / Wine cmd.exe, command.com (MSDOS, FreeDOS ...).
Publiqué la versión inicial de ese script which_interpreter alrededor de 2004 en usenet. Sven Mascheck tiene un script (probablemente más útil para usted) llamado whatshell que se enfoca en identificar shells tipo Bourne. También puede encontrar una versión fusionada de nuestros dos scripts allí .
fuente
printpara que sea una función.bash 3.2.53(1)-releasecomo el intérprete que lo interpreta.Esto es lo que uso en mi .profile para verificar varios shells en los sistemas en los que trabajo. No hace distinciones finas entre ksh88 y ksh93, pero nunca me ha fallado.
Tenga en cuenta que no requiere una sola horquilla o tubería.
fuente
ksh93have$KSH_VERSION. Esa variable provienepdkshy nunca llegó a AT&T ksh88.FCEDIT.posh(pdksh con la mayoría de las funciones que no son POSIX eliminadas, por lo que probablemente quiera llamarlo "sh") no tiene FCEDIT ni KSH_VERSION pero tiene PS3 (quizás no por mucho tiempo), aunque es poco probable que uno lo tenga como un shell de inicio de sesión . También tenga en cuenta que el código anterior no reflejaría si estábashozshno enshmodo de emulación, lo que puede ser un problema si está utilizando$PROFILE_SHELLpara decidir si habilitar o no esta o aquella característica. Vea también el whatshell de Sven Mascheck para obtener más información que puede (o no) que desee consultar.Tu podrías intentar
que le dará el nombre del comando asociado con el pid del script.
fuente
cmdacommPOSIXify la respuesta.Si hay un
lsofcomando disponible en su sistema, puede obtener la ruta completa del ejecutable del shell principal obteniendo el PID principalpsy analizando la salida delsof -p $ppid(consulte ¿Cómo determinar el shell actual en el que estoy trabajando? ).fuente
/, si lo usoNR==4, obtengo la ruta al shells parent.shtienen la$PPIDvariable. EnLinux, puedes usarreadlink -f "/proc/$PPID/exe".Fuera de la tierra de Linux o sin acceso al sistema de archivos / proc o equivalente, puede utilizar pstree:
Asumiendo que tienes el pid de
En una Mac:
En una caja de Linux:
El formato y el estilo de la salida de pstree difieren, dependiendo de su entorno, pero puede aplicar la salida ASCII y luego sed / tr / awk / etc. filtre la salida para obtener el shell que ejecuta el script.
Entonces, una versión de salida limpia (funciona para Mac o Linux OS):
En ejecución rendimientos:
Y cuando se ejecuta con un shell diferente:
Rendimientos:
No se requiere root o sistema de archivos especial. Tenga en cuenta que mi filtrado supone que el nombre binario del shell termina con sh y que no hay entradas intermedias que terminen con sh. También supone que no nombró a su script "sh" o algún patrón grep desafortunado que borrará la información. :) Necesitará un poco de personalización para su propio entorno para garantizar un mayor grado de infalibilidad.
fuente
Puedes usar el comando:
para descubrir el shell desde el script.
fuente
$SHELLes la cáscara de elección del usuario. Inicializado desde el shell de inicio de sesión del usuario. Nada que ver con el shell actualmente en ejecución.