Piszę skrypt bash, w którym chcę wyjść, jeśli użytkownik nie jest rootem. Warunkowe działa dobrze, ale skrypt nie kończy działania.
[[ `id -u` == 0 ]] || (echo "Must be root to run script"; exit)
Próbowałem użyć &&
zamiast, ;
ale nie działa.
Piszę skrypt bash, w którym chcę wyjść, jeśli użytkownik nie jest rootem. Warunkowe działa dobrze, ale skrypt nie kończy działania.
[[ `id -u` == 0 ]] || (echo "Must be root to run script"; exit)
Próbowałem użyć &&
zamiast, ;
ale nie działa.
Odpowiedzi:
Możesz to zrobić w ten sposób:
[[ $(id -u) -eq 0 ]] || { echo >&2 "Must be root to run script"; exit 1; }
(„zwykłe” wyrażenie warunkowe z arytmetycznym operatorem binarnym w pierwszej instrukcji) lub:
(( $(id -u) == 0 )) || { echo >&2 "Must be root to run script"; exit 1; }
(ocena arytmetyczna dla pierwszego testu).
Zwróć uwagę na zmianę ()
-> {}
- nawiasy klamrowe nie odradzają podpowłoki. (Wyszukaj man bash
„subshell”.)
[[
do porównywania numerycznego, użyj ((
.
[[
jest w porządku, o ile używasz -eq
zamiast ==
.
(( EUID )) && ...
Nawiasy wokół tych poleceń tworzą podpowłokę . Twoje echo podpowłoki „Musi być rootem, aby uruchomić skrypt”, a następnie każesz podpowłoce wyjść (chociaż już by to zrobił, ponieważ nie było więcej poleceń). Najłatwiejszym sposobem, aby to naprawić, jest prawdopodobnie użycie if
:
if [[ `id -u` != 0 ]]; then
echo "Must be root to run script"
exit
fi
id -u == 0
, co oznaczałoby, że są głównym. Chcesz [[ $(id -u) != 0 ]]; then
.
[ "$UID" != 0 ] && echo 'You have to be root.' && exit 1;
Zwróć również uwagę na $UID
, co oszczędza proces odradzania. Myślę, że może wolisz $EUID
.
((UID)) && echo 'You have to be root.' && exit 1
.
set -e
. Jednym z rozwiązań tego problemu jest [ "$UID" != 0 ] && echo 'You have to be root.' && exit 1 || true
.
Z uderzeniem :
[ $UID -ne 0 ] && echo "Must be root to run script" && exit 1
echo
nie powiedzie (na przykład, ponieważ standardowe wyjście nie jest zapisywalne).
Wsporniki wokół ||
i &&
nie są wymagane, ponieważ są odpowiednio skojarzone. Następujące dwa wyrażenia są równoważne:
expr1 || expr2 && expr3
expr1 || { expr2 && expr3 }
Więc &&
zamiast ;
działałoby dobrze, jak echo
powróci prawda.
[[ $(id -u) == 0 ]] || echo "Must be root to run script" && exit 1
to może ci pomóc w 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
aby zrozumieć proces nadrzędny, w którym wystąpił problem.