
Pode-se usar shebang
line 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 .
/ source
para 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 sed
comando 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 sed
comando, 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 $SHELL
não é confiável. Coloque isso em um idshell
arquivo:
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, dash
está mentindo??? (e assim é, sh
já que resolve dash
no meu Ubuntu).