2015-08-14 79 views
0

我已经命令了一个命令,返回'版本:X'。bash:解析命令的输出并将其存储到变量中

即:

$>./mybox -v 
$>version:2 

我不明白为什么这不工作:

$>VERSION=$(/home/mybox -v | sed 's/.*version:\([0-9]*\).*/\1/') 
$>echo $VERSION 
$> 

,如果我写这篇文章,它是确定:

$>VERSION=$(echo "version:2" | sed 's/.*version:\([0-9]*\).*/\1/') 
$>echo $VERSION 
$>2 

问候

回答

5

这对versi来说很常见打开/错误/调试信息发送到stderr,而不是stdout。当从终端运行命令时,两者都将被打印,但只有stdout将通过管道传送到sed

echo默认情况下,输出始终为stdout,这就是为什么您在那里没有问题。

如果以上是正确的,你只需要重定向stderr(文件描述符2)将其传递之前stdout(文件描述符1):

VERSION=$(/home/mybox -v 2>&1 | sed 's/.*version:\([0-9]*\).*/\1/') 
#       ^^^^ 
+0

不会“版本:2”的出现在这种情况下在控制台?它不在问题的例子中。 – Sleafar

+2

@Sleafar通常是的,除非它在复制粘贴或控制台行覆盖的工件中被忽略。这可能是一个评论,但它变得越来越长,我决定改变预感。 –

相关问题