Ich schreibe ein Bash-Skript, in dem ich beenden möchte, wenn der Benutzer nicht root ist. Die Bedingung funktioniert einwandfrei, aber das Skript wird nicht beendet.
[[ `id -u` == 0 ]] || (echo "Must be root to run script"; exit)
Ich habe versucht, &&
anstatt ;
aber keine Arbeit zu verwenden.
bash
shell
shell-script
scripting
Garrett Hall
quelle
quelle
exit 1
den Vorgang mit einem anderen Code als Null. Beispiel: Damit Sie den übergeordneten Prozess verstehen, bei dem ein Problem aufgetreten ist.[[
für den numerischen Vergleich verwenden, verwenden((
.[[
ist in Ordnung, solange Sie-eq
statt verwenden==
.(( EUID )) && ...
Die Klammern um diese Befehle erstellen eine Unterschale . In Ihrer Subshell wird das Echo "Muss root sein, um das Skript auszuführen" angezeigt , und Sie weisen die Subshell an , das Skript zu beenden (obwohl dies bereits geschehen wäre, da keine weiteren Befehle vorhanden waren). Der einfachste Weg, dies zu beheben, besteht wahrscheinlich darin, einfach Folgendes zu verwenden
if
:quelle
id -u == 0
, das würde bedeuten , dass Sie sind root. Sie möchten[[ $(id -u) != 0 ]]; then
.[ "$UID" != 0 ] && echo 'You have to be root.' && exit 1;
Beachten Sie auch das$UID
, was das Laichen eines Prozesses erspart. Ich denke, Sie könnten es sogar vorziehen$EUID
.((UID)) && echo 'You have to be root.' && exit 1
.set -e
. Eine Lösung für dieses Problem ist[ "$UID" != 0 ] && echo 'You have to be root.' && exit 1 || true
.Mit Bash :
quelle
echo
fehlschlägt (z. B. weil stdout nicht beschreibbar ist).Klammern um
||
und&&
sind nicht erforderlich, da diese rechtsassoziativ sind. Die folgenden zwei Ausdrücke sind äquivalent:Also
&&
anstatt;
würde es gut funktionieren, daecho
wird es wieder wahr.quelle
das könnte dir helfen, in bash
quelle