이 답변에서, 독자가 읽을 수 있다고 가정 bash
하고 POSIX 쉘 스크립트를dash
.
나는 투표가 많은 답변이 많은 것을 설명하는 좋은 일을하기 때문에 여기에 설명 할 것이 많지 않다고 생각합니다.
그러나 추가로 설명 할 것이 있으면 주저하지 말고 격차를 메우도록 최선을 다하겠습니다.
전체적으로 최적화 bash
성능과 안정성을 위해 솔루션입니다. 모든 쉘 호환
새로운 솔루션 :
# bool function to test if the user is root or not
is_user_root () { [ ${EUID:-$(id -u)} -eq 0 ]; }
벤치 마크 (파일로 저장 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
독창적 인 솔루션 :
#!/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
^^^ 파업 된 솔루션은 속도를 높이 지 않는 것으로 입증되었지만 오랜 시간 동안 사용되어 왔으므로 필요에 따라 여기에 보관할 것입니다.
설명
POSIX에 명령을 실행하는 것보다 $EUID
표준 bash
사용자 변수 인 효과적인 사용자 ID 번호 를 읽는 것이 훨씬 빠르기 때문에 사용자 ID를 찾기 만하면이 솔루션은 둘 다 훌륭하게 묶인 함수로 결합됩니다. is가 어떤 이유로 든 사용할 수없는 경우에만 명령이 실행 되어 상황에 관계없이 올바른 반환 값을 얻습니다 .id -u
$EUID
id -u
OP가 요청한 오랜 세월이 지난 후에이 솔루션을 게시하는 이유
글쎄, 올바르게 보면 위의 코드가 누락 된 것 같습니다.
당신은 고려해야 할 많은 변수 가 있으며, 그중 하나는 성능과 신뢰성을 결합 하는 것입니다 .
휴대용 POSIX 솔루션 + 위 기능 사용 예
#!/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
결론
마음에 들지 않는 한, 유닉스 / 리눅스 환경은 다양해졌습니다. 좋아하는 사람들이 있다는 의미bash
너무 이식성을 생각조차하지 않습니다 ( POSIX 쉘). 나와 같은 다른 사람들은 POSIX 쉘을 선호합니다 . 오늘날은 개인적으로 선택하고 필요로하는 문제입니다.
id -u
돌아갑니다0
.