2014-01-11 64 views
4

我可能根本不知道如何说出我所问的内容,但我一直无法获得我正在寻找的答案。运行脚本的Bash捕获输出

所以我想要在bash脚本中运行一个命令或脚本,一行一行地捕获输出,并根据一些值进行检查。

我已经试过的东西的

#!/bin/bash 
./runningscript.sh | while read line; do 
echo "output $line" 
done 

#!/bin/bash 

./runningscript.sh | {read line echo "output $line"} 

都似乎只是执行脚本给我正常的输出效果。我想要的是在这个bash脚本中处理来自runscript.sh的每一行输出,因为它是输出,我不希望它等到runningscript.sh完成运行来处理它。

对不起,我是一个很偶然的,简单的bash用户因此这可能要问愚蠢的问题,但任何帮助,将不胜感激

回答

7

你脚本工作。但输出直到后期才出现,甚至可能在命令完成后出现?这通常是因为缓冲:runningscript.sh必须填满缓冲区,通常为4 kB,然后才能通过管道将其输出传输到管道中的下一个进程。

一个修复程序是使用unbuffer命令这是expect包的一部分:

unbuffer runningscript.sh | something_else 

这花样runningscript.sh以为该写入到交互终端。因此,它不会缓冲。

如需更多信息,请参阅https://unix.stackexchange.com/questions/25372/turn-off-buffering-in-pipe

或者,如果你有GNU的coreutils 7.5或更好,你可以禁用与stdbuf命令输出缓冲:

stdbuf -oO runningscript.sh | something_else 
+0

这正是我所需要的,非常感谢你!对不起,我不能赞成,我没有我猜的声誉。 – hmoebius

+1

Upvoted现在我有足够的代表。再次感谢! – hmoebius

1

我看到的最常见的形式是:

while read line; do 
    stuff to $line 
done < $(somescript.sh) 
+0

感谢您的帮助。我仍然得到相同的结果,虽然我的脚本由于选项错误,所以我把它包含在$()中,所以它看起来更像'done <$(./ runningscript.sh --opt ........ )'这可能与它有关吗? – hmoebius

0

对于这个,你必须编辑runningscript.sh并把echo或任何行动,你想把它放在自己的循环。管道不能帮助你,因为它首先完成它的第一个程序,然后把它输出到第二个程序。如果您改进了runningscript.sh,则不需要使用额外的脚本。