为什么这会导致文件为空?

时间:2010-12-15 16:53:16

标签: bash unix

TMP="$$.FILE"

#Process puts contents into TMP

cat "$TMP" | sort |  head > "$TMP"

我已经确定该文件不是空的。没有> "$TMP",它输出一些东西,但当它再次存储到同一个文件中时,它是空的。可能是什么原因?

3 个答案:

答案 0 :(得分:3)

您无法同时写入和读取文件。这大致是发生了什么:

  1. > "$TMP"导致文件被打开以进行写入,这也会截断文件。
  2. cat "$TMP"从现在的空白文件中读取。
  3. 文件保持空白。
  4. 声称修改文件的命令实际上执行了一些临时文件改组。例如,sed -i将处理输入文件并将结果保存到input.tmp,然后在结尾处执行mv input.tmp input以覆盖原始文件。你应该遵循那个模型。

答案 1 :(得分:2)

这些进程都是并行运行的,所以head命令会在cat有机会读取之前截断文件。

要获得所需的结果,您需要将排序输出写入另一个文件,然后将其移到原始文件上。

cat "$TMP" | sort | head > "$TMP".new
mv "$TMP".new "$TMP"

答案 2 :(得分:1)

在真正发生任何事情之前,最后一个管道将截断第一个管道读取的文件。那么会发生什么cat尝试读取对head的调用立即截断的文件。这是造成这里问题的原因; >运算符是一个shell运算符,意味着“立即截断此文件,然后让进程将其标准输出写入文件。

相关说明,此处不需要cat

请改为尝试:

TMP="$$.FILE"    
sort <"$TMP" | head > "$TMP.tmp"
mv "$TMP.tmp" "$TMP"