Nesta resposta, fique claro, presumo que o leitor é capaz de ler bash
e scripts shell POSIX como dash
.
Acredito que não há muito o que explicar aqui, já que as respostas altamente votadas fazem um bom trabalho ao explicar grande parte delas.
No entanto, se houver algo a explicar mais, não hesite em comentar, farei o meu melhor preenchendo as lacunas.
Polivalente otimizado (não apenas bash
Solução ) para desempenho e confiabilidade; todas as conchas compatíveis
Nova solução:
# bool function to test if the user is root or not
is_user_root () { [ ${EUID:-$(id -u)} -eq 0 ]; }
Referência (salvar em arquivo 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
Solução 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
^^^ A solução riscada foi comprovada para não acelerar as coisas, mas existe há muito tempo, então vou mantê-la aqui pelo tempo que achar necessário.
Explicação
Como é muito mais rápido ler a variável $EUID
padrão bash
, o número de ID do usuário efetivo, do que executar o id -u
comando para POSIX - apenas encontrar o ID do usuário, esta solução combina ambos em uma função bem compactada. Se, e somente se, $EUID
por algum motivo não estiver disponível, o id -u
comando será executado, garantindo que obtemos o valor de retorno adequado, independentemente das circunstâncias .
Por que postei esta solução após tantos anos que o OP perguntou
Bem, se eu entendi corretamente, parece haver um pedaço de código ausente acima.
Veja bem, existem muitas variáveis que precisam ser levadas em consideração, e uma delas é combinar desempenho e confiabilidade .
Solução portátil POSIX + Exemplo de uso da função acima
#!/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
Conclusão
Por mais que você não goste, o ambiente Unix / Linux se diversificou bastante. Ou seja, existem pessoas que gostam bash
tanto, que nem pensam em portabilidade ( cartuchos POSIX ). Outros como eu preferem as conchas POSIX . Hoje em dia é uma questão de escolha e necessidades pessoais.
id -u
retorne0
para o root.