In dieser Antwort sei klar, ich gehe davon aus, dass der Leser POSIX- Shell-Skripte lesen bash
und mögen kann .dash
Ich glaube, hier gibt es nicht viel zu erklären, da die hoch bewerteten Antworten viel davon gut erklären.
Wenn es jedoch noch etwas zu erklären gibt, zögern Sie nicht zu kommentieren, ich werde mein Bestes tun, um die Lücken zu schließen.
Optimierte Allround- bash
Lösung (nicht nur ) für Leistung und Zuverlässigkeit; Alle Muscheln kompatibel
Neue Lösung:
# bool function to test if the user is root or not
is_user_root () { [ ${EUID:-$(id -u)} -eq 0 ]; }
Benchmark (in Datei speichern is_user_root__benchmark
)
###############################################################################
## is_user_root() benchmark ##
## Bash is fast while Dash is slow in this ##
## Tested with Dash version 0.5.8 and Bash version 4.4.18 ##
## Copyright: 2020 Vlastimil Burian ##
## E-mail: info@vlastimilburian.cz ##
## License: GPL-3.0 ##
## Revision: 1.0 ##
###############################################################################
# intentionally, the file does not have executable bit, nor it has no shebang
# to use it, please call the file directly with your shell interpreter like:
# bash is_user_root__benchmark
# dash is_user_root__benchmark
# bool function to test if the user is root or not
is_user_root () { [ ${EUID:-$(id -u)} -eq 0 ]; }
# helper functions
print_time () { date +"%T.%2N"; }
print_start () { printf '%s' 'Start : '; print_time; }
print_finish () { printf '%s' 'Finish : '; print_time; }
readonly iterations=10000
printf '%s\n' '______BENCHMARK_____'
print_start
i=1; while [ $i -lt $iterations ]; do
is_user_root
i=$((i + 1))
done
print_finish
Ursprüngliche Lösung:
#!/bin/bash
is_user_root()
# function verified to work on Bash version 4.4.18
# both as root and with sudo; and as a normal user
{
! (( ${EUID:-0} || $(id -u) ))
}
if is_user_root; then
echo 'You are the almighty root!'
else
echo 'You are just an ordinary user.'
fi
^^^ Es hat sich gezeigt, dass die durchgestrichene Lösung die Dinge nicht beschleunigt, aber es gibt sie schon lange, also werde ich sie hier behalten, solange ich es für notwendig halte.
Erläuterung
Da das Lesen der $EUID
Standardvariablen bash
, der effektiven Benutzer-ID-Nummer, um ein Vielfaches schneller ist als das Ausführen eines id -u
Befehls zum POSIX- Finden der Benutzer-ID, kombiniert diese Lösung beides zu einer gut gepackten Funktion. Wenn und nur wenn der $EUID
aus irgendeinem Grund nicht verfügbar ist, wird der id -u
Befehl ausgeführt, um sicherzustellen, dass wir unabhängig von den Umständen den richtigen Rückgabewert erhalten .
Warum ich diese Lösung nach so vielen Jahren poste, hat das OP gefragt
Nun, wenn ich richtig sehe, scheint oben ein fehlender Code zu fehlen.
Sie sehen, es gibt viele Variablen, die berücksichtigt werden müssen, und eine davon ist die Kombination von Leistung und Zuverlässigkeit .
Tragbare POSIX- Lösung + Beispiel für die Verwendung der oben genannten Funktion
#!/bin/sh
# bool function to test if the user is root or not (POSIX only)
is_user_root() { [ "$(id -u)" -eq 0 ]; }
if is_user_root; then
echo 'You are the almighty root!'
exit 0 # unnecessary, but here it serves the purpose to be explicit for the readers
else
echo 'You are just an ordinary user.' >&2
exit 1
fi
Fazit
So sehr es Ihnen auch nicht gefällt, die Unix / Linux-Umgebung hat sich stark verändert. Das heißt, es gibt Leute, die bash
so sehr mögen , dass sie nicht einmal an Portabilität denken ( POSIX- Shells). Andere wie ich bevorzugen die POSIX- Shells. Es ist heutzutage eine Frage der persönlichen Wahl und der Bedürfnisse.
id -u
gibt0
für root zurück.