0

我不明白为什么输出是用户名,因为在第 3 行和第 4 行必须 print /usr/bin/whoami。请对我简单的解释

#!/bin/bash

WHEREWHOAMI="`which whoami`"
ROOTORNOT="`$WHEREWHOAMI`"
echo "$ROOTORNOT"
4

2 回答 2

1

该变量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
$ 
于 2019-03-19T20:00:35.043 回答
1

甚至在双引号内也会评估反引号。
(建议 - 不要使用反引号。$()改用。)

WHEREWHOAMI="`which whoami`"

这将执行which whoami并分配/usr/bin/whoamiWHEREWHOAMI.

ROOTORNOT="`$WHEREWHOAMI`"

/usr/bin/whoami在反引号中执行,并将 USERNAME 结果分配给ROOTORNOT.

它正在做它应该做的事情。
这不是你想要的吗?

也许你想要的是——

$: [[ $( $(which whoami) ) == root ]] && echo ROOT || echo not-root
not-root

尽管我确实建议存储该值并进行比较。有没有理由你不能只使用

if [[ root == "$LOGNAME" ]] 
then : ...

?

于 2019-03-19T20:15:33.803 回答