Shebang, intérprete y guión

Shebang, intérprete y guión

Se puede usar shebanguna línea para proporcionar el intérprete que se utilizará para ejecutar un script:

#!/bin/bash
echo "Hello world"

Mi pregunta es cómo podemos determinar en el guión qué intérprete se utiliza realmente. Lo siguiente no funciona:

echo $0
echo $SHELL

Respuesta1

Si te entiendo correctamente, entonces deseas extraer el shell de la primera línea del script.

Cuando lo usa, $SHELLmuestra el shell que realmente está usando, que no tiene por qué ser el mismo que el especificado en la primera línea: por ejemplo, puede usar el comando ./ sourcepara ejecutar cualquier script en cualquier shell que se esté ejecutando actualmente.

Lo siguiente mostrará el shell desde la primera línea:

sed -n '1 s/^#!//p' "$0"

Aquí $0está el script en ejecución y el sedcomando imprime la primera línea sin el inicio #!. Si no existe dicha línea, no se devolverá nada y podrá comprobarlo.

Puede utilizar $(...)para obtener el valor del sedcomando, por ejemplo: -

echo Script "$0" is running with "$SHELL"
echo It should run with "$(sed -n '1 s/^#!//p' "$0")"

Respuesta2

Usar:

echo $(readlink -e /proc/$$/exe)

(en otras palabras, verifique el ejecutable de su propio proceso).

Editar: Parece que $SHELLno es confiable. Pon esto en un idshellarchivo:

echo I am process $$
echo SHELL is $SHELL
echo /proc/$$/exe is $(readlink -e /proc/$$/exe)

y luego compare las salidas de:

>bash idshell
I am process 24012
SHELL is /bin/bash
/proc/24012/exe is /bin/bash

y

>dash idshell
I am process 24062
SHELL is /bin/bash
/proc/24062/exe is /bin/dash

Entonces dashes mentir??? (y también lo es shdesde que se resuelve dashen mi Ubuntu).

información relacionada