Dalam jawaban ini, biarkan itu menjadi jelas, saya kira pembaca dapat membaca bash
dan POSIX shell scripts like dash
.
Saya percaya tidak ada banyak yang bisa dijelaskan di sini karena jawaban yang dipilih dengan sangat baik menjelaskan banyak hal.
Namun, jika ada sesuatu untuk dijelaskan lebih lanjut, jangan ragu untuk berkomentar, saya akan melakukan yang terbaik untuk mengisi kekosongan ini.
bash
Solusi serba optimal (tidak hanya ) untuk kinerja dan keandalan; semua kerang kompatibel
Solusi baru:
# bool function to test if the user is root or not
is_user_root () { [ ${EUID:-$(id -u)} -eq 0 ]; }
Benchmark (simpan ke 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
Solusi asli:
#!/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
^^^ Solusi striked-out terbukti tidak mempercepat, tetapi sudah ada sejak lama, jadi saya akan menyimpannya di sini selama saya melihat perlu.
Penjelasan
Karena banyak kali lebih cepat untuk membaca variabel $EUID
standar bash
, nomor ID pengguna yang efektif, daripada menjalankan id -u
perintah untuk POSIX - hanya menemukan ID pengguna, solusi ini menggabungkan keduanya menjadi fungsi yang dikemas dengan baik. Jika, dan hanya jika, $EUID
karena alasan apa pun tidak tersedia, id -u
perintah akan dieksekusi, memastikan kami mendapatkan nilai pengembalian yang tepat, apa pun kondisinya .
Mengapa saya memposting solusi ini setelah bertahun-tahun OP bertanya
Nah, jika saya melihat dengan benar, sepertinya ada kode yang hilang di atas.
Soalnya, ada banyak variabel yang harus diperhitungkan, dan salah satunya adalah menggabungkan kinerja dan keandalan .
Solusi POSIX portabel + Contoh penggunaan fungsi di atas
#!/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
Kesimpulan
Sebanyak mungkin Anda tidak menyukainya, lingkungan Unix / Linux telah sangat beragam. Berarti ada orang yang bash
sangat menyukai, mereka bahkan tidak memikirkan portabilitas ( cangkang POSIX ). Orang lain seperti saya lebih suka kerang POSIX . Sekarang ini masalah pilihan dan kebutuhan pribadi.
id -u
mengembalikan0
untuk root.