
Se puede usar shebang
una 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, $SHELL
muestra 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 .
/ source
para 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í $0
está el script en ejecución y el sed
comando 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 sed
comando, 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 $SHELL
no es confiable. Pon esto en un idshell
archivo:
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 dash
es mentir??? (y también lo es sh
desde que se resuelve dash
en mi Ubuntu).