Bash捕获运行脚本的输出

时间:2014-01-11 07:37:26

标签: linux bash shell

我可能根本不知道如何说出我要问的内容,但我无法得到我正在寻找的答案。

所以我想要的是在bash脚本中运行命令或脚本逐行捕获输出并检查它是否符合某个值。

我已经尝试了

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

#!/bin/bash

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

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

对不起,我是一个非常偶然和简单的bash用户,所以这可能是最愚蠢的问题,但任何帮助将不胜感激

3 个答案:

答案 0 :(得分: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

答案 1 :(得分:1)

我最常见的表格是:

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

答案 2 :(得分:0)

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