我正在编写一个小框架,其中的流程在概念上是这样的:
cat input.txt | ./first.sh | ./second.sh > output.txt
请原谅这里无用的使用cat;只会让事情变得更清楚但我想要其他几个属性:
cat
从头开始写并不难。但是感觉好像有人以前做过这个,也许是用Make,但是我还没有找到它。
iaqfqrcu1#
正如在其他评论中提到的,你不能并行运行它们,因为一个脚本可能直到 * 之后 * 才失败,它已经将一些输出通过管道传输到下一个脚本。因此管道将被断开。考虑到这一点,你可以临时文件。类似这样的操作将起作用:
output.txt: ./first.sh < input.txt > .first.txt || cat input.txt > .first.txt ./second.sh < .first.txt > .second.txt || cat .first.txt > .second.txt rm .first.txt ./third.sh < .second.txt > $@ || cat .second.txt > $@ rm .second.txt
因此,如果first.sh失败,那么到目前为止它输出的任何内容都将被替换为nothing。如果second.sh失败,它将使用第一步输出的任何内容(nothing或正确的输出)覆盖其输出,如果third.sh失败,则输出第二步输出的任何内容。我相信这就是您想要的。
first.sh
second.sh
third.sh
1条答案
按热度按时间iaqfqrcu1#
正如在其他评论中提到的,你不能并行运行它们,因为一个脚本可能直到 * 之后 * 才失败,它已经将一些输出通过管道传输到下一个脚本。因此管道将被断开。考虑到这一点,你可以临时文件。类似这样的操作将起作用:
因此,如果
first.sh
失败,那么到目前为止它输出的任何内容都将被替换为nothing。如果second.sh
失败,它将使用第一步输出的任何内容(nothing或正确的输出)覆盖其输出,如果third.sh
失败,则输出第二步输出的任何内容。我相信这就是您想要的。