In questa risposta, sia chiaro, presumo che il lettore sia in grado di leggere bash
e scrivere script shell POSIX come dash
.
Credo che non ci sia molto da spiegare qui, dato che le risposte molto votate fanno un buon lavoro nel spiegarne gran parte.
Tuttavia, se c'è qualcosa da spiegare ulteriormente, non esitate a commentare, farò del mio meglio per colmare le lacune.
bash
Soluzione a tutto tondo ottimizzata (non solo ) per prestazioni e affidabilità; compatibile con tutte le shell
Nuova soluzione:
# bool function to test if the user is root or not
is_user_root () { [ ${EUID:-$(id -u)} -eq 0 ]; }
Benchmark (salva su file 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
Soluzione originale:
#!/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
^^^ È stato dimostrato che la soluzione eliminata non accelera le cose, ma esiste da molto tempo, quindi la terrò qui per tutto il tempo che riterrò necessario.
Spiegazione
Poiché è molto più veloce leggere la variabile $EUID
standard bash
, il numero ID utente effettivo, rispetto all'esecuzione del id -u
comando POSIX per trovare facilmente l'ID utente, questa soluzione combina entrambe in una funzione ben confezionata. Se, e solo se, $EUID
non è disponibile per qualsiasi motivo, il id -u
comando verrà eseguito, assicurandoci di ottenere il valore di ritorno corretto, indipendentemente dalle circostanze .
Perché inserisco questa soluzione dopo così tanti anni che l'OP ha chiesto
Bene, se vedo correttamente, sembra che ci sia un pezzo di codice mancante sopra.
Vedete, ci sono molte variabili che devono essere prese in considerazione e una di queste sta combinando prestazioni e affidabilità .
Soluzione POSIX portatile + Esempio di utilizzo della funzione sopra
#!/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
Conclusione
Per quanto possibilmente non ti piaccia, l'ambiente Unix / Linux si è diversificato molto. Significa che ci sono persone a cui piace bash
così tanto che non pensano nemmeno alla portabilità ( shell POSIX ). Altri come me preferiscono le shell POSIX . Oggi è una questione di scelta e necessità personali.
id -u
restituisce0
per root.