Qual interpretador de shell executa um script sem hashbang ... mas é executado como sudo?

4

Esta é uma extensão para Que interpretador de shell é executado um roteiro sem shebang?

Eu estava testando minha compreensão do que o interpretador é usado e encontrei um comportamento estranho ao executar um script sem hashbang, mas como sudo.

O script é o seguinte:

echo "I am running shell $SHELL"

foo=$'dollar'
echo "run with sudo to see the magic dollar sign <$foo>"

Quando eu corri este script como meu usuário normal, tudo bem, saídas: I am running shell /bin/bash run with sudo to see the magic dollar sign <dollar>

Mas quando eu corro com o sudo, recebo a saída I am running shell /bin/bash run with sudo to see the magic dollar sign <$dollar>

Portanto, sem sudo, foo se expande para "dollar", mas com sudo, a avaliação $ '' é ignorada e se torna "$ dollar"

Eu agora também entendo que $ '' não é compatível com POSIX, e portanto não necessariamente funcionaria se o script fosse executado, exceto sob bash. E confirme que sudo bash myscript.sh retorna a saída esperada de "dólar".

No entanto, em qualquer um desses cenários, $ SHELL indica que o script está sendo executado sob o comando bash. O que está acontecendo?

PS - my / bin / sh links to dash - só posso pensar que tem algo a ver com isso

    
por Dave P 09.11.2018 / 20:25

1 resposta

6

$SHELL não informa qual shell você está executando, ele informa qual é a variável de ambiente SHELL . Bash define isso para o caminho para o seu shell de login, se ainda não estiver definido.

Você está executando sh ( dash , para você) sob sudo, o que é possível ver diretamente usando pstree :

$ cat test.sh
pstree $$
$ ./test.sh
bash───pstree
$ sudo ./test.sh
sh───pstree

O uso de sh está de acordo com o POSIX, embora essa parte da especificação não esteja vinculada às opções de implementação do sudo.

readlink /proc/$$/exe também confirmará que é dash especificamente. Você também pode usar qualquer uma das outras maneiras de identificar o shell em execução a partir da pergunta que você vinculou.

No traço, $'abc' é um sinal de dólar solitário sem significado seguido por uma sequência de aspas simples - basicamente da mesma maneira que foo=$ manteria o sinal em qualquer shell.

    
por 09.11.2018 / 21:05

Tags