在此答案中,请明确说明,我假设读者能够阅读bash
和POSIX shell脚本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
^^^被淘汰的解决方案被证明不能加快速度,但是已经存在很长时间了,因此只要有必要,我就将其保留在这里。
说明
由于读取$EUID
标准bash
变量(有效的用户ID号)要比执行id -u
命令POSIX来查找用户ID的速度快很多倍,因此该解决方案将两者结合在一起,成为一个很好的打包函数。当且仅当$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
结论
尽管您可能不喜欢它,但Unix / Linux环境已经多样化了很多。意味着有些人非常喜欢bash
,他们甚至没有想到可移植性(POSIX shell)。像我这样的人更喜欢POSIX外壳。如今,这是个人选择和需求的问题。
id -u
返回0
root。