Shebang, intérprete e um roteiro

Shebang, intérprete e um roteiro

Pode-se usar shebangline para fornecer o intérprete a ser usado para executar um script:

#!/bin/bash
echo "Hello world"

Minha pergunta é como podemos determinar no script qual intérprete é realmente usado. O seguinte não funciona:

echo $0
echo $SHELL

Responder1

Se bem entendi, você deseja extrair o shell da primeira linha do script.

Quando você usa$SHELL você mostra o shell que está realmente usando, que não precisa ser o mesmo especificado na primeira linha: por exemplo, você pode usar o comando ./ sourcepara executar qualquer script em qualquer shell que esteja sendo executado no momento.

O seguinte mostrará o shell da primeira linha:

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

Aqui$0 está o script em execução, e o sedcomando imprime a primeira linha com o início #!removido. Se não houver tal linha, nada será retornado e você poderá verificar isso.

Você pode usar $(...)para obter o valor do sedcomando, por exemplo: –

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

Responder2

Usar:

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

(em outras palavras, verifique o executável do seu próprio processo).

Editar: parece que $SHELLnão é confiável. Coloque isso em um idshellarquivo:

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

e compare os resultados de:

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

e

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

Então, dashestá mentindo??? (e assim é, shjá que resolve dashno meu Ubuntu).

informação relacionada