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.
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.
Respostas:
Você poderia fazer isso desta maneira:
[[ $(id -u) -eq 0 ]] || { echo >&2 "Must be root to run script"; exit 1; }
(expressão condicional "comum" com um operador binário aritmético na primeira instrução) ou:
(( $(id -u) == 0 )) || { echo >&2 "Must be root to run script"; exit 1; }
(avaliação aritmética do primeiro teste).
Observe a alteração ()
-> {}
- os colchetes não geram um subshell. (Procure man bash
por "subshell".)
[[
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
:
if [[ `id -u` != 0 ]]; then
echo "Must be root to run script"
exit
fi
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 :
[ $UID -ne 0 ] && echo "Must be root to run script" && exit 1
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:
expr1 || expr2 && expr3
expr1 || { expr2 && expr3 }
Então, em &&
vez de ;
iria funcionar muito bem, como echo
retornará verdadeiro.
[[ $(id -u) == 0 ]] || echo "Must be root to run script" && exit 1
isso pode ajudá-lo, no bash
[oracle@rac1 ~]$ which bash
/bin/bash
[oracle@rac1 ~]$ cat test1.sh
if [ `id -u` != 0 ]
then
echo "Must be root to run the script
"
exit
fi
exit 1
para entender o processo pai que ocorreu um problema.