管理脚本中文件更改的最佳实践

时间:2011-11-23 07:43:00

标签: bash workflow

我有一个BASH脚本,可以对文件执行许多操作,例如:

cp input.txt file.tmp1
sed (code) file.tmp1 > file.tmp2
sed (code) file.tmp2 > file.tmp3
sed (code) file.tmp3 > file.tmp4
sed (code) file.tmp4 > file.tmp5
sed (code) file.tmp5 > file.tmp6
sed (code) file.tmp6 > file.tmp7
cp output.txt

这样:

  • 原始文件未更改。
  • 我可以检查每个阶段的文件更改,只是为了确保我的代码没有做错任何事。

但是,这似乎不是处理文件的理想方式。

  • 有更好的方法吗?
  • 是否有任何工具可以帮助检查更改,只是为了查看是否有异常引入?

2 个答案:

答案 0 :(得分:3)

处理临时文件是个不错的主意,但您应该使用mktemp(1)安全地制作临时文件。

虽然使用多个文件进行多次传递没有任何问题,但可以考虑使用mktemp -d为所有文件创建一个临时目录,以确保永远不会覆盖用户关心的任何内容。

但如果您永远不会查看中间文件,可以像这样处理多次传递:

sed (code) input.txt | sed (code) | sed (code) | sed (code) | ...
    sed (code) > output.txt

如果一个失败,它们都会失败,这可以使错误处理更容易。完成后没有要删除的临时文件。

如果您想检查管道是否有错误,tee会对您有所帮助。它将所有输入重定向到其标准输出和管道,如下所示:

sed (code) input.txt | sed (code) | tee state-of-pipe.txt | sed (code) | ...
    sed (code) > output.txt

您可以使用diff -u input.txt output.txt检查更改。 diff(1)是一个行差异计划,-u统一输出非常容易阅读。 wdiff(1)是一个单词差异计划,对某些情况可能更有用。

而且xxdiff(1)是一个极好的GUI界面,用于检查两个文件之间的差异 - 它会努力向您显示单独更改的字符。 (它对于处理CVS和SVN样式的冲突文件也很棒,但这完全是另一回事。)

答案 1 :(得分:1)

更有效的方法是使用管道。 E.g:

cat input.txt | sed ... | ... | sed ... > output.txt

问题在于你无法检查不同阶段的变化。