`>` 和 `>>` 如何工作?

Vin*_*tux 9 command-line redirect

我尝试创建rev一个文件,然后通过管道将其传输到该文件,cat > same_file但它变成了一个空白文件。

虽然我尝试过rev file.txt | cat > file2.txt && mv file.txt file2.txt;它奏效了。

甚至rev file.txt | cat >> file.txt;工作。

但是当我尝试rev file.txt | cat > file.txt它时失败了。

Lui*_*ado 19

在这种情况下,您需要在两种重定向方式(> 和 >>)之间掌握的基本内容是:

>

重定向并覆盖所指向的信息。通过管道“|”接收任何信息时会发生这种情况

>>

重定向并连接到它所指向的信息。通过管道“|”接收任何信息时会发生这种情况

在这两种情况下,如果文件不存在,则会创建它。如果您在同一文件上再次运行它,则只有在“>>”上才会连接信息。使用“>”,您将简单地覆盖您在第一次运行时所做的一切。

但这是使用与输出文件相同的输入文件时的处理。在这种特殊情况下,如果您使用“>”,您将删除“输入”部分需要解析的信息,因为输出文件将“覆盖它”。所以在:

rev file.txt | cat > file.txt
Run Code Online (Sandbox Code Playgroud)

“慢动作解释”中实际发生的是:

  1. rev准备反转内容file.txt并将其发送到管道
  2. rev将信息发送到管道时,管道将其直接流式传输到cat.
  3. cat接收信息时,它会自动将其应用于file.txt设置的信息。
  4. 这里的关键词是“while”,因为一切都在同一时间发生。请看下面 Emil 的精彩评论,对这部分有更深入的了解。
  5. cat不会等待rev管道整个文件。它会在第一部分信息到达它的那一刻开始,这意味着,根据您使用的符号,它将打开到file.txt.
  6. 在这种情况下,由于您使用了>而不是>>,shell 将截断输出文件,这意味着它将打开并清除的信息,file.txt同时等待新信息到达它。使用>>它将打开一个连接file.txt并等待检测到的最后一行的新信息。
  7. 因为信息已经file.txt>清除了,所以rev会尝试做它的工作并且什么也得不到,因为cat删除了所有为新信息做准备的东西。

那么为什么其他人在阅读上述内容后工作。因为这:

rev file.txt | cat > file2.txt && mv file.txt file2.txt
Run Code Online (Sandbox Code Playgroud)

在这里,您正在通过管道将信息发送到另一个文件。在这种情况下,处理后的输入文件file.txt与输出文件不同file2.txt。之后,你是从字面上覆盖全file2.txtfile.txt,因此所有提出的过程中cat被删除。基本上整行都可以简化,cp file.txt file2.txt因为它在做同样的事情,因为file2.txt最后丢失了rev并被mv命令覆盖。

rev file.txt | cat >> file.txt
Run Code Online (Sandbox Code Playgroud)

在这种情况下,您将信息连接到同一个文件。因此,它仅打开与该文件的连接,但不会删除单个>所见的信息。最终结果应该是,原始信息加上反向信息。

  • 该文件不会被 cat 截断。它被 shell 截断,*before* 管道中的任何命令甚至启动。 (5认同)
  • 另请参阅 [moreutils](https://joeyh.name/code/moreutils/),这是一个很棒的工具集合(可从包存储库中作为 `moreutils` 获得),其中包括 `sponge`,这是一个专门为以下用例设计的工具覆盖输入文件。例如,`rev file.txt >file2.txt && mv file2.txt file.txt` 变通方法将变成`rev file.txt | 海绵文件.txt`,即使已经有名为`file2.txt`的东西也能正常工作。 (4认同)

mur*_*uru 9

当 shell 看到重定向时,它首先打开相关文件,然后再执行任何涉及的命令。因此,当您执行以下操作时:

foo file.txt | bar > file.txt
Run Code Online (Sandbox Code Playgroud)

重定向file.txt导致它 foo运行之前被截断并且可以读取file.txt. 附带说明一下,这就是您不能这样做的原因:

sed 'blah' file.txt > file.txt
Run Code Online (Sandbox Code Playgroud)

以及为什么sed有就地编辑选项。

最后,做:

.. | cat > file.txt
Run Code Online (Sandbox Code Playgroud)

cat 的无用用法,尤其是如果您试图从file.txt早期开始阅读。

如果您想就地反转文件,则没有快捷方式。您也许可以在就地编辑中使用sedawk技巧。