Trong câu trả lời này, hãy nói rõ, tôi cho rằng người đọc có thể đọc bash
và các kịch bản shell POSIX như thế nào dash
.
Tôi tin rằng không có nhiều điều để giải thích ở đây vì các câu trả lời được bình chọn cao làm tốt công việc giải thích nhiều về nó.
Tuy nhiên, nếu có bất cứ điều gì để giải thích thêm, đừng ngần ngại bình luận, tôi sẽ cố gắng hết sức để lấp đầy các khoảng trống.
Tối ưu hóa bash
giải pháp toàn diện (không chỉ ) cho hiệu suất và độ tin cậy; tất cả các vỏ tương thích
Giải pháp mới:
# bool function to test if the user is root or not
is_user_root () { [ ${EUID:-$(id -u)} -eq 0 ]; }
Điểm chuẩn (lưu vào tệp 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
Giải pháp ban đầu:
#!/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
^^ ^ Giải pháp nổi bật đã được chứng minh là không tăng tốc mọi thứ, nhưng nó đã có từ lâu, vì vậy tôi sẽ giữ nó ở đây miễn là tôi thấy cần thiết.
Giải trình
Vì việc đọc biến $EUID
tiêu chuẩn nhanh hơn nhiều lần bash
, số ID người dùng hiệu quả, hơn là thực thi id -u
lệnh để POSIX -ly tìm ID người dùng, giải pháp này kết hợp cả hai thành một chức năng được đóng gói độc đáo. Nếu và chỉ khi, $EUID
vì bất kỳ lý do nào không có sẵn, id -u
lệnh sẽ được thực thi, đảm bảo chúng tôi nhận được giá trị trả về phù hợp bất kể trường hợp nào .
Tại sao tôi đăng giải pháp này sau nhiều năm OP đã hỏi
Chà, nếu tôi thấy chính xác, dường như có một đoạn mã bị thiếu ở trên.
Bạn thấy đấy, có rất nhiều biến số phải được tính đến, và một trong số đó là kết hợp hiệu suất và độ tin cậy .
Giải pháp POSIX di động + Ví dụ về việc sử dụng chức năng trên
#!/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
Phần kết luận
Nhiều như bạn có thể không thích, môi trường Unix / Linux đã đa dạng hóa rất nhiều. Có nghĩa là có những người thích bash
rất nhiều, họ thậm chí không nghĩ đến tính di động ( vỏ POSIX ). Những người khác như tôi thích vỏ POSIX . Ngày nay nó là một vấn đề của sự lựa chọn và nhu cầu cá nhân.
id -u
trả về0
cho root.