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

Redirecting the cat ouput of file to the same file

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

cat fileName>fileName

没有显示错误。现在,当我尝试使用

查看文件内容时

cat fileName

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

> 即重定向到同一文件将 create/truncate 调用 cat 命令之前的文件,因为它具有更高的优先级。您可以通过使用中间文件然后从中间文件到实际文件来避免相同的情况,或者您可以使用 tee 之类的:

cat fileName | tee fileName

为了澄清 SMA 的回答,文件被 t运行 分类,因为重定向由 shell 处理,它在调用命令之前打开文件进行写入。当你 运行 cat file > file 时,shell t运行 cates 并打开文件进行写入,将 stdout 设置到文件,然后执行 ["cat", "file"]。所以你将不得不使用一些其他命令来完成任务,比如 tee

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

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

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