Dans cette réponse, soyons clairs, je suppose que le lecteur est capable de lire bash
et de scripts shell POSIX comme dash
.
Je pense qu'il n'y a pas grand-chose à expliquer ici, car les réponses très votées expliquent bien la plupart de ces questions.
Pourtant, s'il y a quelque chose à expliquer, n'hésitez pas à commenter, je ferai de mon mieux pour combler les lacunes.
bash
Solution complète (et pas seulement ) optimisée pour les performances et la fiabilité; tous les coques compatibles
Nouvelle solution:
# bool function to test if the user is root or not
is_user_root () { [ ${EUID:-$(id -u)} -eq 0 ]; }
Benchmark (enregistrer dans un fichier 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
Solution 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
^^^ La solution supprimée s'est avérée ne pas accélérer les choses, mais elle existe depuis longtemps, donc je vais la garder ici aussi longtemps que je le jugerai nécessaire.
Explication
Comme il est plusieurs fois plus rapide de lire la variable $EUID
standard bash
, le numéro d'ID utilisateur effectif, que d'exécuter une id -u
commande pour POSIX- trouver l'ID utilisateur, cette solution combine les deux en une fonction bien emballée. Si, et seulement si, $EUID
pour une raison quelconque n'est pas disponible, la id -u
commande sera exécutée, garantissant que nous obtenons la valeur de retour appropriée quelles que soient les circonstances .
Pourquoi je poste cette solution après tant d'années que le PO a demandé
Eh bien, si je vois bien, il semble y avoir un morceau de code manquant ci-dessus.
Vous voyez, il existe de nombreuses variables qui doivent être prises en compte, et l'une d'entre elles combine performances et fiabilité .
Solution POSIX portable + Exemple d'utilisation de la fonction ci-dessus
#!/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
Conclusion
Autant que vous ne l'aimez peut-être pas, l'environnement Unix / Linux s'est beaucoup diversifié. Cela signifie qu'il y a des gens qui aiment bash
tant, ils ne pensent même pas à la portabilité ( coquilles POSIX ). D'autres comme moi préfèrent les coques POSIX . C'est aujourd'hui une question de choix et de besoins personnels.
id -u
retourne0
pour root.