Shebang, intérprete e um script

0

Pode-se usar shebang line para fornecer o intérprete para usar 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
    
por Ringger81 29.03.2018 / 11:54

2 respostas

0

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

Quando você usa $SHELL , está mostrando o shell que está realmente usando, que não precisa ser o mesmo que o especificado na primeira linha: por exemplo, você pode usar o comando . / source para execute 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 é o script em execução, e o comando sed imprime a primeira linha com o primeiro #! removido. Se não houver essa linha, nada será devolvido e você poderá verificar isso.

Você pode usar $(...) para obter o valor do comando sed , por exemplo: -

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

Uso:

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

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

Editar: parece que $SHELL não é confiável. Coloque isso em um arquivo idshell :

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

e, em seguida, compare as saídas 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, dash está mentindo ??? (e por isso é sh desde que resolve para dash no meu Ubuntu).

    
por 29.03.2018 / 14:26