TMP="$$.FILE"
#Process puts contents into TMP
cat "$TMP" | sort | head > "$TMP"
我已经确定该文件不是空的。没有> "$TMP"
,它输出一些东西,但当它再次存储到同一个文件中时,它是空的。可能是什么原因?
答案 0 :(得分:3)
您无法同时写入和读取文件。这大致是发生了什么:
> "$TMP"
导致文件被打开以进行写入,这也会截断文件。cat "$TMP"
从现在的空白文件中读取。声称修改文件的命令实际上执行了一些临时文件改组。例如,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"