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.
bash
shell
shell-script
scripting
Garrett Hall
źródło
źródło
exit 1
aby zrozumieć proces nadrzędny, w którym wystąpił problem.[[
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
:źródło
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 :
źródło
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:Więc
&&
zamiast;
działałoby dobrze, jakecho
powróci prawda.źródło
to może ci pomóc w bash
źródło