在这个回答中,我假定读者能够理解bash、zsh等现代shell与dash等便携式POSIX shell之间的区别。
我相信这里没有太多要解释的,因为高投票的答案已经很好地解释了大部分问题。
但是,如果有什么需要进一步解释的,请不要犹豫,我会尽我最大的努力填补空白。
优化的性能和可靠性全方位解决方案;所有外壳兼容
新的解决方案:
# 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" |
#| Language: POSIX shell script |
#| Copyright: 2020-2021 Vlastimil Burian |
#| M@il: info[..]vlastimilburian[..]cz |
#| License: GPL 3.0 |
#| Version: 1.2 |
#+------------------------------------------------------------------------------+
readonly iterations=10000
# intentionally, the file does not have an executable bit, nor it has a shebang
# to use it, just call the file directly with your shell interpreter like:
# bash is_user_root__benchmark ## should take a fraction of one second
# dash is_user_root__benchmark ## could take around 10 seconds
is_user_root () { [ "${EUID:-$(id -u)}" -eq 0 ]; }
print_time () { date +"%T.%2N"; }
print_start () { printf '%s' 'Start : '; print_time; }
print_finish () { printf '%s' 'Finish : '; print_time; }
printf '%s\n' '___is_user_root()___'; print_start
i=1; while [ "$i" -lt "$iterations" ]; do
is_user_root
i=$((i+1))
done; print_finish
使用和持续时间的例子:
$ dash is_user_root__benchmark
___is_user_root()___
Start : 03:14:04.81
Finish : 03:14:13.29
$ bash is_user_root__benchmark
___is_user_root()___
Start : 03:16:22.90
Finish : 03:16:23.08
解释
由于读取$EUID标准bash变量(有效的用户ID号)要比执行ID -u命令以POSIX-ly方式查找用户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!'
# You can do whatever you need...
else
echo 'You are just an ordinary user.' >&2
exit 1
fi
结论
尽管您可能不喜欢它,但Unix / Linux环境已经变得非常多样化。这意味着有些人非常喜欢bash、zsh和其他现代shell,他们甚至不会考虑可移植性(POSIX)。如今,这是个人选择和需要的问题。