为什么将文件“cat”到自身中会删除它?

为什么将文件“cat”到自身中会删除它?

可能的重复:
IO重定向和head命令

我只想删除文件中除第一行之外的所有内容。我这样做了:

head -1 foo.txt

...并验证我只看到了第一行。然后我做了:

head -1 foo.txt > foo.txt

但现在不再只包含第一行,而是foo.txt空的。

事实证明这cat foo.txt > foo.txt也清空了文件。

为什么?

答案1

在 shell 开始处理任何数据之前,它需要确保所有输入和输出都已平方。

因此,在您的情况下,使用> foo.txt基本上告诉系统:“创建一个名为的(新)文件foo.txt并将该命令的所有输出粘贴到该文件中”。

正如您所发现的,问题在于这会清除以前的内容。

相关,>>附加到现有文件。

更新:

这是使用的解决方案sed,请小心处理:

 sed -i '2,$d' foo.txt

它将删除第 2 行到“最后”到位在文件中foo.txt。最好先在一个你能承受得起搞乱的文件上尝试一下:)

该命令的这个稍微修改的版本将保留原始版本的副本,.bak扩展名:

 sed -i.bak '2,$d' foo.txt

您可以在命令行开关后指定任何字符序列(或单个字符)-i作为“备份”(即原始)文件的名称。

答案2

因为您用来调用的 shellcat会执行由 指示的重定向>

shell(bash、zsh、ksh、dash 等)读取命令cat foo.txt > foo.txt。 shell 必须设置由 指示的重定向> foo.txt>意味着从顶部开始写入文件,>>意味着附加到 foot.txt。

当 shell 实际cat运行时,foo.txt 已经消失了。

相关内容