Quando você digita esta
su www-data
whatever
something-else
exit
su
inicia um shell adicional como www-data
user. Então você digita comandos consecutivos, eles são executados neste shell, então exit
traz de volta ao shell antigo.
Se esses comandos estiverem em um script, whatever
não será executado no shell adicional. O shell original esperará que su
saia antes de ir para whatever
e mais. Se você executar um script desse tipo (um arquivo como script.sh
com shebang adequado) do terminal, você será levado a um shell interativo . Digite exit
à mão para continuar com o script.
Agora dentro de um script de bootstrap não há nenhum TTY anexado, su www-data
não pode iniciar um shell interativo e sai imediatamente. O restante do script é executado (obviamente, não como www-data
user); e se houver exit
em algum lugar, sairá do script.
A maneira mais limpa de lidar com isso é inserir whatever
e something-else
em um script auxiliar separado, então você pode invocar em seu script principal
su www-data -c "/path/to/the/helper/script"
O script principal aguardará a saída de su
. Quando isso acontece, qualquer linha a seguir é executada pelo usuário original.
Outra maneira é assim:
su www-data -c 'whatever; something-else'
ou equivalentemente
su www-data -c '
whatever
something-else
'
A última abordagem pode ser problemática se os comandos precisarem de cotação. Não existe esse problema com um script adicional.