Bash - 获取命令的输出

时间:2015-02-10 00:43:00

标签: linux bash shell

无论我做什么,我似乎无法将命令的输出分配给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)"

然后它有效。我想知道为什么。


这就是我的意思:

Failure

正如您所看到的," OUTPUT:"字符串出现在命令输出之后,这意味着输出没有存储在变量中,而是在主shell中运行,这让我感到困惑。

以下是OUTPUT="$(ls -la)"

时发生的情况

Success

在这种情况下," OUTPUT:"之前,显示echo命令正常工作。

有什么想法吗?

2 个答案:

答案 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