Según mi conocimiento, para determinar el shell actual que usamos echo $0
en el shell. Más bien quiero que mi script verifique en qué shell se está ejecutando. Entonces, intenté imprimir $0
en 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 $0
No 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é variantesh
es?Respuestas:
En Linux puedes usar
/proc/PID/exe
.Ejemplo:
fuente
/bin/sed -r -e 's/\x0.*//' /proc/$$/cmdline
da 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)./proc
es tan feo e inportable como se pone./proc
no es "feo"/proc
A menudo es una solución muy elegante. Inportable sí, pero porque algo no es portátil no lo hace feo./proc
feo 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
print
para que sea una función.bash 3.2.53(1)-release
como 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
ksh93
have$KSH_VERSION
. Esa variable provienepdksh
y 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ábash
ozsh
no ensh
modo de emulación, lo que puede ser un problema si está utilizando$PROFILE_SHELL
para 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
cmd
acomm
POSIXify la respuesta.Si hay un
lsof
comando disponible en su sistema, puede obtener la ruta completa del ejecutable del shell principal obteniendo el PID principalps
y 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.sh
tienen la$PPID
variable. 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
$SHELL
es 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.