我不明白为什么输出是用户名,因为在第 3 行和第 4 行必须 print /usr/bin/whoami
。请对我简单的解释
#!/bin/bash
WHEREWHOAMI="`which whoami`"
ROOTORNOT="`$WHEREWHOAMI`"
echo "$ROOTORNOT"
该变量ROOTORNOT
设置为执行的输出,而执行的WHEREWHOAMI
输出又是命令的输出which whoami
。
WHEREWHOAMI=`which whoami` # <- /usr/bin/whoami
ROOTWHOAMI="`$WHEREWHOAMI`" # <- `/usr/bin/whoami` # <- username
set -x
如果将标志添加到脚本中,您可以轻松弄清楚发生了什么。例子:
$ set -x
$ WHEREWHOAMI="`which whoami`"
++ alias
++ declare -f
++ /usr/bin/which --tty-only --read-alias --read-functions --show-tilde --show-dot whoami
+ WHEREWHOAMI=/usr/bin/whoami
$ ROOTORNOT="`$WHEREWHOAMI`"
++ /usr/bin/whoami
+ ROOTORNOT=kvantour
$ echo "$ROOTORNOT"
+ echo kvantour
kvantour
$
甚至在双引号内也会评估反引号。
(建议 - 不要使用反引号。$()
改用。)
WHEREWHOAMI="`which whoami`"
这将执行which whoami
并分配/usr/bin/whoami
给WHEREWHOAMI
.
ROOTORNOT="`$WHEREWHOAMI`"
这/usr/bin/whoami
在反引号中执行,并将 USERNAME 结果分配给ROOTORNOT
.
它正在做它应该做的事情。
这不是你想要的吗?
也许你想要的是——
$: [[ $( $(which whoami) ) == root ]] && echo ROOT || echo not-root
not-root
尽管我确实建议存储该值并进行比较。有没有理由你不能只使用
if [[ root == "$LOGNAME" ]]
then : ...
?