【发布时间】:2016-06-08 11:32:16
【问题描述】:
我写了一个程序,它等待标准输入上的数据,把它写到一个 临时位置,并在输入结束时将其移动到用户指定的位置。
通过这个,我想启用这样的管道
# Does not work; truncates myfile
cat myfile | some_filter > myfile
# shall enable pseudo-inplace modification
cat myfile | some_filter | my_program myfile
但我的程序当前写入文件,无论上游管道是否成功。如果上游遇到错误,我想避免数据丢失,因此如果管道上游的程序之一抛出错误,则中止程序。
到目前为止,我用 bash 编写了程序,但并不局限于此。
如何在我的程序中检查这一点?
编辑:更具体地说:我想让我的用户处理创建临时文件,尽可能检查中间程序和类似程序的成功。我希望用户能够在某个文件上调用某个程序(例如,将列添加到文本文件、排序、过滤等)并将结果写回同一个文件,但前提是中间程序返回成功。
【问题讨论】:
-
您可以尝试使用mktemp制作临时文件,写入临时文件,检查过程是否成功完成,然后从临时文件写入您的文件,删除临时文件。
-
解释@dood所说的:
tmpfile=$(mktemp); process1 | process2 > $tmpfile && mv $tmpfile myfile -
另外,
cat myfile | some_filter是 UUOC。请改用some_filter < myfile。 -
@dood 是的,这基本上就是我在程序中写入的内容。但是,我想对用户隐藏这一点,这就是为什么我问是否可以检查上游程序的错误代码从内部下游程序。
-
@anishsane 你说得对,我写这个只是为了更好地可视化管道结构。