Answers:
在这种情况下,两种重定向方式(>和>>)之间需要掌握的基本知识是:
重定向并覆盖指向的信息。通过管道“ |”接收任何信息时,会发生这种情况
重定向并连接到所指向的信息。通过管道“ |”接收任何信息时,会发生这种情况
在这两种情况下,如果文件都不存在,则会创建该文件。如果在同一文件上再次运行该信息,则仅在“ >>”上将其串联。使用“>”,您将简单地覆盖您在第一次运行中所做的一切。
但是,当使用与输出文件相同的输入文件时,这就是问题。在这种特定情况下,如果使用“>”,则将删除“输入”部分需要解析的信息,因为输出文件将“覆盖它”。所以在:
rev file.txt | cat > file.txt
“慢动作说明”中实际发生的是:
rev
准备反转内容file.txt
并将其发送到管道rev
将信息发送到管道时,管道将其直接流传输到cat
。cat
接收信息时,它将自动将其应用于file.txt
设置的信息。cat
不会等待rev
管道整个文件。它只会从信息第一部分开始的那一刻开始,这意味着,根据您使用的符号,它将打开与的连接file.txt
。file.txt
。使用>>,它将打开与的连接,file.txt
并在检测到的最后一行上等待新信息。file.txt
使用>清除了该信息,因此rev
将尝试执行该操作,但一无所获,因为cat
删除了所有内容以准备新信息。那么为什么其他人在阅读了上面的内容后仍然可以工作。因为这:
rev file.txt | cat > file2.txt && mv file.txt file2.txt
在这里,您正在使用cat来将信息发送到另一个文件。在这种情况下,处理后的输入文件file.txt
与输出文件不同file2.txt
。之后,你是从字面上覆盖全file2.txt
用file.txt
,因此所有提出的过程中cat
被删除。基本上,可以简化整行,cp file.txt file2.txt
因为它在做同样的事情,因为file2.txt
最后放宽了rev
,并被mv
命令覆盖。
rev file.txt | cat >> file.txt
在这种情况下,您要将信息串联到同一文件中。因此,它仅打开与该文件的连接,而不会擦除如单个>所示的信息。最终结果应该是原始信息加上反向信息。
rev file.txt | cat --bogus-option > file.txt
也会截断该文件,即使cat不会尝试打开它也是如此。
moreutils
),其中包括sponge
专门为覆盖输入文件的用例而设计的工具。例如,rev file.txt >file2.txt && mv file2.txt file.txt
变通方法将变为rev file.txt | sponge file.txt
,即使已经存在名为的方法也可以正常工作file2.txt
。
cat
了这样的:rev file.txt > file2.txt && mv file2.txt file.txt
。这是的多余用法cat
。通过省略它,您可以多余地产生额外的过程。