En esta respuesta, que quede claro, supongo que el lector puede leer bash
y ejecutar scripts de shell POSIX comodash
.
Creo que no hay mucho que explicar aquí ya que las respuestas altamente votadas hacen un buen trabajo al explicar gran parte de ello.
Sin embargo, si hay algo más que explicar, no dude en comentar, haré todo lo posible para llenar los vacíos.
bash
Solución integral optimizada (no solo ) para rendimiento y confiabilidad; todos los depósitos compatibles
Nueva solución:
# bool function to test if the user is root or not
is_user_root () { [ ${EUID:-$(id -u)} -eq 0 ]; }
Benchmark (guardar en archivo 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
Solución original:
#!/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
^^^ Se demostró que la solución eliminada no acelera las cosas, pero ha existido durante mucho tiempo, así que la mantendré aquí todo el tiempo que considere necesario.
Explicación
Dado que es muchísimo más rápido leer la variable $EUID
estándar bash
, el número de identificación de usuario efectivo, que ejecutar el id -u
comando para encontrar la ID de usuario POSIX , esta solución combina ambos en una función muy bien empaquetada. Si, y solo si, $EUID
por alguna razón no está disponible, el id -u
comando se ejecutará, asegurando que obtengamos el valor de retorno adecuado sin importar las circunstancias .
¿Por qué publico esta solución después de tantos años?
Bueno, si veo correctamente, parece que falta un fragmento de código arriba.
Verá, hay muchas variables que deben tenerse en cuenta, y una de ellas es combinar rendimiento y confiabilidad .
Solución POSIX portátil + Ejemplo de uso de la función anterior
#!/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
Conclusión
Por mucho que posiblemente no te guste, el entorno Unix / Linux se ha diversificado mucho. Lo que significa que hay personas a las que les gusta bash
tanto, que ni siquiera piensan en la portabilidad ( shells POSIX ). Otros como yo prefieren los proyectiles POSIX . Hoy en día es una cuestión de elección personal y necesidades.
id -u
devuelve0
para root.