Bash如何捕获运行脚本的输出?

4

我可能不知道如何表达我的问题,但我一直没有找到我需要的答案。

所以我想要做的是在bash脚本中运行一个命令或脚本,逐行捕获输出并检查其是否等于某个值。

我已经尝试了一些类似于以下的方式:

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

and

#!/bin/bash

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

两者似乎只是执行脚本并给出正常的输出,我希望能够在这个Bash脚本中处理runningscript.sh的每一行输出,而不是等待runningscript.sh运行结束再处理它。

对不起,我只是一个偶尔使用简单Bash的用户,所以这可能是我提出的最愚蠢的问题,但任何帮助都将不胜感激。

3个回答

8
你的脚本是可以运行的。但是输出可能会很晚才出现,甚至在命令完成后才出现?这通常是因为缓冲的原因:runningscript.sh必须填满一个缓冲区,通常是4 kB,然后它的输出才能通过管道传输到管道中的下一个进程。
解决方法是使用expect包中的unbuffer命令。
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

这正是我所需要的,非常感谢!很抱歉我不能点赞,我想是因为我的声望不够。 - hmoebius

1
我最常见到的表单是:
while read line; do
    stuff to $line
done < $(somescript.sh)

谢谢您的帮助。尽管我的脚本因为选项而出错,但我仍然得到了相同的结果,所以我将其包含在$()中,看起来更像是 'done < $(./runningscript.sh --opt .........)'这样。这可能与此有关吗? - hmoebius

0

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接