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.