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)
“慢动作解释”中实际发生的是:
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
Run Code Online (Sandbox Code Playgroud)
在这里,您正在通过管道将信息发送到另一个文件。在这种情况下,处理后的输入文件file.txt
与输出文件不同file2.txt
。之后,你是从字面上覆盖全file2.txt
用file.txt
,因此所有提出的过程中cat
被删除。基本上整行都可以简化,cp file.txt file2.txt
因为它在做同样的事情,因为file2.txt
最后丢失了rev
并被mv
命令覆盖。
rev file.txt | cat >> file.txt
Run Code Online (Sandbox Code Playgroud)
在这种情况下,您将信息连接到同一个文件。因此,它仅打开与该文件的连接,但不会删除单个>所见的信息。最终结果应该是,原始信息加上反向信息。
当 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
早期开始阅读。
如果您想就地反转文件,则没有快捷方式。您也许可以在就地编辑中使用sed
或awk
技巧。