我有两个脚本,假设 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。谢谢。
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"
),除非你特别知道什么时候不引用。