Estou escrevendo um script bash onde quero sair se o usuário não for root. O condicional funciona bem, mas o script não sai.
[[ `id -u` == 0 ]] || (echo "Must be root to run script"; exit)
Eu tentei usar em &&
vez de, ;
mas não funciona.
bash
shell
shell-script
scripting
Garrett Hall
fonte
fonte
exit 1
para entender o processo pai que ocorreu um problema.[[
para comparação numérica, use((
.[[
é bom, desde que você use em-eq
vez de==
.(( EUID )) && ...
Os parênteses em torno desses comandos criam um subshell . O eco de seu subshell "Deve ser root para executar o script" e você solicita que o subshell saia (embora já fosse, já que não havia mais comandos). A maneira mais fácil de corrigir isso é provavelmente usar apenas um
if
:fonte
id -u == 0
, o que significaria que você é root. Você quer[[ $(id -u) != 0 ]]; then
.[ "$UID" != 0 ] && echo 'You have to be root.' && exit 1;
Observe também o$UID
que economiza a geração de um processo. Eu acho que você pode até preferir$EUID
.((UID)) && echo 'You have to be root.' && exit 1
.set -e
seja interrompido. Uma solução para esse problema é[ "$UID" != 0 ] && echo 'You have to be root.' && exit 1 || true
.Com bash :
fonte
echo
falhar (por exemplo, porque stdout não é gravável).Suportes ao redor
||
e&&
não são necessários, pois são associativos à direita. As duas expressões a seguir são equivalentes:Então, em
&&
vez de;
iria funcionar muito bem, comoecho
retornará verdadeiro.fonte
isso pode ajudá-lo, no bash
fonte