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

Linux 在两个脚本之间使用I/O重定向,无需等待第一个脚本完成,linux,bash,shell,pipeline,io-redirection,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

我有两个脚本,比如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必须等待长脚本结束后才能启动

我想知道在bashshell中是否可以看到每行simple.sh的输出,这样我就可以在运行时看到此时正在处理哪一行

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

标准输出通常是缓冲的。您需要缓存行。试一试

stdbuf -oL sh long.sh | sh simple.sh
注意,这个循环

for line in `cat LONGIFLE.dat`; do   # see where I put the semi-colon?
从文件中读取单词。如果你每行只有一个单词,你就可以了。否则,要按行读取,请使用
,而IFS=read-r行;做完成


始终引用变量(
echo“$line”
),除非您明确知道何时不引用。

这是一种良好的本能,但实验表明long.sh循环中的echo没有缓冲。(我很好奇是否有一个标准澄清echo是否具有内置的不得缓冲区,但很明显/bin/echo不能将其输出添加到shell的缓冲区中。)尝试
sh long.sh | stdbuf-oL sh simple.sh
istead。请注意,管道的整个要点是,右侧不必等待左侧完成,与使用临时文件(如
sh long.sh>tmp)的情况相同;sh simple.sh