我不明白为什么输出是用户名,因为在第3行和第4行中必须打印/usr/bin/whoami
。
请对我来说简单的移植
#!/bin/bash
WHEREWHOAMI="`which whoami`"
ROOTORNOT="`$WHEREWHOAMI`"
echo "$ROOTORNOT"
答案 0 :(得分: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
$
答案 1 :(得分:1)
即使在双引号内也对反引号进行评估。
(建议-不要使用反引号。请使用$()
。)
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 : ...
?