Bu cevapta, net olsun, okuyucunun okuduğu bash
ve POSIX kabuk komut dosyalarınıdash
.
Yüksek oylanan cevapların çoğunu açıklamak için iyi bir iş çıkardığı için burada açıklanacak çok şey olmadığına inanıyorum.
Ancak, daha fazla açıklanacak bir şey varsa, yorum yapmaktan çekinmeyin, boşlukları doldurmak için elimden geleni yapacağım.
bash
Performans ve güvenilirlik için optimize edilmiş çok yönlü (sadece değil ) çözüm; tüm mermiler uyumlu
Yeni çözüm:
# bool function to test if the user is root or not
is_user_root () { [ ${EUID:-$(id -u)} -eq 0 ]; }
Karşılaştırma ölçütü (dosyaya kaydet 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
Orijinal çözüm:
#!/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
^^^ Çarpıcı çözüm, işleri hızlandırmak için kanıtlanmadı, ancak uzun zamandır var, bu yüzden gerekli gördüğüm sürece burada tutacağım.
açıklama
Etkili kullanıcı kimlik numarası olan $EUID
standart bash
değişkeni okumak id -u
için POSIX -ly kullanıcı kimliğini bulmak için komut yürütmekten çok daha hızlı olduğundan , bu çözüm her ikisini de iyi paketlenmiş bir işlevde birleştirir. Eğer ve sadece $EUID
herhangi bir nedenden dolayı mevcut değilse, id -u
komut çalıştırılacak ve koşullar ne olursa olsun uygun dönüş değerini almamızı sağlayacaktır .
OP'yi bu kadar yıl sonra neden bu çözümü gönderiyorum?
Peki, doğru görürsem, yukarıda eksik bir kod parçası var gibi görünüyor.
Görülmesi gereken birçok değişken var ve bunlardan biri performans ve güvenilirliği birleştiriyor .
Taşınabilir POSIX çözümü + Yukarıdaki fonksiyonun kullanım örneği
#!/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
Sonuç
Beğenmediğiniz kadar Unix / Linux ortamı çok çeşitlendi. Yani bash
çok hoşlanan insanlar var, taşınabilirliği bile düşünmüyorlar ( POSIX kabukları). Benim gibi diğerleri POSIX mermilerini tercih ediyor . Bugünlerde kişisel seçim ve ihtiyaçlar söz konusudur.
id -u
geri döner0
.