Bash 捕获正在运行的脚本的输出



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

所以我要做的是在 bash 脚本中运行命令或脚本,逐行捕获输出并根据某个值进行检查。

我已经尝试过一些事情,大意是

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

#!/bin/bash
./runningscript.sh | {read line echo "output $line"}

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

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

您的脚本可以工作。 但是输出直到很晚才出现,甚至可能在命令完成后? 这通常是因为缓冲: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

我最常看到的形式是:

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

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

相关内容

  • 没有找到相关文章

最新更新