我可能根本不知道如何表达我所问的内容,但我无法得到我正在寻找的答案。
所以我要做的是在 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,则无需使用额外的脚本。