shell 我可以用Make管道命令吗,但只有当它们成功时

zqry0prt  于 2023-03-24  发布在  Shell
关注(0)|答案(1)|浏览(109)

我正在编写一个小框架,其中的流程在概念上是这样的:

cat input.txt | ./first.sh | ./second.sh > output.txt

请原谅这里无用的使用cat;只会让事情变得更清楚
但我想要其他几个属性:

  • 如果任何一个脚本失败(返回代码不为零),它的输入将被传递到下一个脚本,就好像它不存在一样
  • 理想情况下,我们缓存中间步骤以避免重做工作。

从头开始写并不难。
但是感觉好像有人以前做过这个,也许是用Make,但是我还没有找到它。

iaqfqrcu

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失败,则输出第二步输出的任何内容。我相信这就是您想要的。

相关问题