在两个脚本之间使用I / O重定向,而无需等待第一个完成

时间:2014-02-18 16:26:09

标签: linux bash shell pipeline io-redirection

我有两个脚本,比方说long.sh和simple.sh:一个非常耗时,另一个非常简单。第一个脚本的输出应该用作第二个脚本的输入。

例如,“long.sh”可能是这样的:

#!/bin/sh
for line in `cat LONGIFLE.dat` do;
    # read line;
    # do some complicated processing (time consuming);
    echo $line
done;

简单的是:

#!/bin/sh
while read a; do
    # simple processing;
    echo $a + "other stuff"
done;

我想管道这两个脚本:

sh long.sh | sh simple.sh

使用管道,simple.sh必须等待长脚本的结束才能启动。

我想知道在bash shell中是否可以看到每个当前行的simple.sh输出,这样我就可以在运行时看到此时正在处理的是什么行。

我不想将两个脚本合并在一起,也不想在long.sh中调用simple.sh. 非常感谢你。

1 个答案:

答案 0 :(得分:2)

stdout通常是缓冲的。你想要行缓冲。尝试

stdbuf -oL sh long.sh | sh simple.sh

请注意此循环

for line in `cat LONGIFLE.dat`; do   # see where I put the semi-colon?

从文件中读取字词。如果每行只有一个单词,那么你没问题。否则,要按行阅读,请使用while IFS= read -r line; do ...; done < LONGFILE.dat

总是引用您的变量(echo "$line"),除非您特别知道何时不知道。