将文件的cat输出重定向到同一文件

时间:2016-09-10 13:41:17

标签: linux unix terminal cat

在一个特定的目录中,我创建了一个名为" fileName"的文件。并添加内容。当我输入cat fileName时,它的内容会打印在终端上。现在我使用了以下命令:

cat fileName>fileName

未显示任何错误。现在,当我尝试使用

查看文件内容时

cat fileName

终端中没有显示任何内容,文件为空(当我检查时)。这是什么原因?

3 个答案:

答案 0 :(得分:0)

Picasso.with(context).load(appShowModule.getAllimage().get(position)).into(holder.appImage); 即,重定向到同一文件将在调用cat命令之前创建/截断文件,因为它具有更高的优先级。您可以通过使用中间文件然后从中间文件到实际文件来避免相同的操作,或者您可以使用tee:

>

答案 1 :(得分:0)

为了澄清SMA的答案,文件被截断,因为重定向由shell处理,它在调用命令之前打开文件进行写入。当您运行cat file > file时,shell将截断并打开文件进行写入,将stdout设置为该文件,然后执行["cat", "file"]。因此,您必须使用其他命令执行tee

之类的任务

答案 2 :(得分:0)

这里给出的答案是错误的。无论使用重定向还是管道,您都会遇到截断问题,尽管有时可能会看起来起作用,具体取决于文件大小或管道长度。这是一种竞争条件,因为读者可能有机会在作者开始之前读取部分或全部文件,但管道的重点是同时运行所有这些,以便它们同时启动tee 可执行文件要做的第一件事就是打开输出文件(并在此过程中截断它)。在这种情况下,您不会遇到问题的唯一方法是管道的末端是否会将整个输出加载到内存中,并且仅在关闭时将其写入文件。这不太可能发生,并且失去了管道的意义。

使其可靠的正确解决方案是只写入临时文件,然后将临时文件重命名回原始文件名:

TMP="$(mktemp fileName.XXXXXXXX)"
cat fileName | grep something | tee "${TMP}"
mv "${TMP}" fileName