无论我做什么,我似乎无法将命令的输出分配给bash中的变量。虽然我的脚本运行没有任何错误,但我没有得到我想要的结果:
# Prompt if the user needs Qt
echo ""
echo "Checking for qt5-default."
echo ""
OUTPUT="$(sudo dpkg -s qt5-default)"
echo "OUTPUT:"
echo $OUTPUT
...
OUTPUT
永远不会回应任何事情。但是,如果我这样做:
OUTPUT="$(ls -la)"
然后它有效。我想知道为什么。
这就是我的意思:
正如您所看到的," OUTPUT:"字符串出现在命令输出之后,这意味着输出没有存储在变量中,而是在主shell中运行,这让我感到困惑。
以下是OUTPUT="$(ls -la)"
:
在这种情况下," OUTPUT:"之前,显示echo
命令正常工作。
有什么想法吗?
答案 0 :(得分:2)
OUTPUT=$( dpkg -s qt5-default 2>&1 )
应该做你想要的事。正如Etan指出的那样,dpkg的输出转到stderr,而不是stdout。
答案 1 :(得分:1)
dpkg -s
不需要root权限。好的做法从不在脚本中使用sudo
,但需要脚本的root权限。
关于你的问题:为什么会这样?因为sudo
在子shell中运行(括号$(...)
打开子shell)
我会尝试找一个关于bash陷阱和子shell的好参考,我不记得我在哪里读到它。试试这个:Subshell Pitfalls