In dieser Antwort sei klar, dass ich davon ausgehe, dass der Leser den Unterschied zwischen modernen Shells wie bash
, zsh
und anderen im Vergleich zu portablen POSIX-Shells wie dash
versteht.
Ich glaube, hier gibt es nicht viel zu erklären, da die hoch bewerteten Antworten bereits einen guten Job gemacht haben, vieles zu erklären.
Sollte jedoch noch etwas weiter zu erklären sein, zögern Sie nicht, einen Kommentar abzugeben, ich werde mein Bestes tun, um die Lücken zu füllen.
Optimierte Allround-Lösung für Leistung und Zuverlässigkeit; mit allen Shells kompatibel
Neue Lösung:
# Funktion zum Testen, ob der Benutzer Root ist oder nicht
is_user_root () { [ "${EUID:-$(id -u)}" -eq 0 ]; }
Benchmark (Speichern in Datei is_user_root__benchmark
)
#+------------------------------------------------------------------------------+
#| is_user_root() Benchmark |
#| "Bash ist schnell, während Dash hier langsam ist" |
#| Sprache: POSIX-Shellskript |
#| Urheberrecht: 2020-2021 Vlastimil Burian |
#| E-Mail: info[..]vlastimilburian[..]cz |
#| Lizenz: GPL 3.0 |
#| Version: 1.2 |
#+------------------------------------------------------------------------------+
readonly iterations=10000
# Absichtlich hat die Datei kein Ausführungsbit und keinen Shebang
# Um sie zu verwenden, rufen Sie die Datei direkt mit Ihrem Shell-Interpreter auf, z. B.:
# bash is_user_root__benchmark ## sollte einen Bruchteil einer Sekunde dauern
# dash is_user_root__benchmark ## könnte etwa 10 Sekunden dauern
is_user_root () { [ "${EUID:-$(id -u)}" -eq 0 ]; }
print_time () { date +"%T.%2N"; }
print_start () { printf '%s' 'Start : '; print_time; }
print_finish () { printf '%s' 'Finish : '; print_time; }
printf '%s\n' '___is_user_root()___'; print_start
i=1; while [ "$i" -lt "$iterations" ]; do
is_user_root
i=$((i+1))
done; print_finish
Beispiele für die Verwendung und Dauer:
$ dash is_user_root__benchmark
___is_user_root()___
Start : 03:14:04.81
Finish : 03:14:13.29
$ bash is_user_root__benchmark
___is_user_root()___
Start : 03:16:22.90
Finish : 03:16:23.08
Erklärung
Da es vielfach schneller ist, die $EUID
Standard-bash
-Variable zu lesen, die effektive Benutzer-ID-Nummer, als den Befehl id -u
POSIX-konform auszuführen, um die Benutzer-ID zu finden, kombiniert diese Lösung beide in eine schön verpackte Funktion. Wenn, und nur wenn, das $EUID
aus irgendeinem Grund nicht verfügbar ist, wird der Befehl id -u
ausgeführt, um sicherzustellen, dass wir den richtigen Rückgabewert erhalten, unabhängig von den Umständen.
Warum ich diese Lösung poste, nachdem der OP vor so vielen Jahren gefragt hat
Nun, wenn ich richtig sehe, scheint oben ein fehlendes Code-Stück zu sein.
Sie sehen, es gibt viele Variablen, die berücksichtigt werden müssen, und eine davon ist die Kombination von Leistung und Zuverlässigkeit.
Tragbare reine POSIX-Lösung + Beispiel für die Verwendung der oben genannten Funktion
#!/bin/sh
# Funktion zum Testen, ob der Benutzer Root ist oder nicht (nur POSIX)
is_user_root ()
{
[ "$(id -u)" -eq 0 ]
}
if is_user_root; then
echo 'Du bist der allmächtige Root!'
# Du kannst alles tun, was du brauchst...
else
echo 'Du bist nur ein gewöhnlicher Benutzer.' >&2
exit 1
fi
Schlussfolgerung
So sehr Sie es vielleicht nicht mögen, die Unix/Linux-Umgebung hat sich stark diversifiziert. Das bedeutet, dass es Menschen gibt, die bash
, zsh
und andere moderne Shells so sehr mögen, dass sie nicht einmal an Portabilität (POSIX) denken. Heutzutage ist es eine Frage der persönlichen Wahl und Bedürfnisse.