Por favor, considere estes dois scripts:
run.sh:
#!/bin/bash
set -euo pipefail
. "$(dirname $(realpath $BASH_SOURCE))"/init-sudo-script.sh
init-sudo-script.sh
[ ${#BASH_SOURCE[@]} -eq 1 ]\
&& echo "must be sourced by another script."\
&& exit 10
[ $EUID -ne 0 ]\
&& echo "must be executed as root."\
&& exit 20
Isso está correto e é o que espero que aconteça:
$ ./run.sh
must be executed as root.
$ echo $?
20
Mas isso eu não consigo entender:
$ sudo ./run.sh
$ echo $?
1
Eu sei que o problema é [ $EUID -ne 0 ]
porque o script funciona quando eu o removo.
Eu também entendo set -e
que faz o script sair em caso de qualquer erro.
O que não entendo é por que a primeira condição de guarda ( [ ${#BASH_SOURCE[@]} -eq 1 ]
) não termina com 1 quando falha, mas a segunda sim.
Alguém entende o que está acontecendo aqui?
===ATUALIZAÇÃO===
Encontrei uma maneira de fazer funcionar como esperado:
if [ $EUID -ne 0 ]; then
echo "must be executed as root."\
&& exit 20
fi
Eu deixaria isso para trás, mas estou investindo para melhorar no Bash. Então, se alguém puder esclarecer o que está acontecendo, eu apreciaria ouvir.
Não "em qualquer erro". Existem exceções, uma delas é:
( fonte )
Se
[ ${#BASH_SOURCE[@]} -eq 1 ]
falhar, o shell não será encerrado por causa deset -e
.Da mesma forma, se
[ $EUID -ne 0 ]
falhar, o shell não será encerrado por causa deset -e
. Mas ele sairá logo em seguida porque o script termina , ou seja, porque não há mais nada para executar. E então o status de saída do script será o status de saída do último comando executado; e acontece que é a falha[
. É por isso que você consegue1
.Coloque
:
(um comando autônomo que sempre funciona) no finalinit-sudo-script.sh
e execute novamente seus testes.sudo ./run.sh
retornará0
porque o último comando será:
.Seu código atualizado
if
é diferente porque o status de saída deif
é:( fonte )