Ubuntu 上的基本 bash 命令:wc -l < file1.txt > file2.txt vs wc -l < file1.txt > file1.txt



我在ubuntu上测试基本bash命令,当我戴上终端

wc -l < file1.txt > file2.txt 

File1中的所有行均由wc读取,并且该数字保存到file2.txt

但是,如果我使用类似的命令wc -l < file1.txt > file1.txt,但是我尝试将其保存在同一> file1中,输出始终为0

这种行为的原因是什么?

编写命令wc -l < file1.txt > file1.txt时,您的外壳将首先读取命令,并重定向标准输入,输出/到file1.txt

然后,当文件打开用于使用>编写的文件时,如果存在文件,则会被覆盖并创建一个空文件。然后,该过程(您的wc)将开始执行,并将其写入其中直到执行结束。

您的wc -l将不得不读取文件并计算其中的行数,因为文件为空(覆盖),它将仅转储:

   0 file1.txt

证明使用>>

在附加模式下发生的情况
$ cat file1.txt
a
b
b
$ wc -l file1.txt 
       3 file1.txt
$ wc -l file1.txt >> file1.txt 
$ cat file1.txt 
a
b
b
       3 file1.txt

您的文件内容完好无损,wc在将结果附加到文件之前确实正确读取了行数。

注意:

通常,从不建议您在同一文件中写和阅读,除非您确切知道自己在做什么。某些命令具有inline选项可以在命令运行期间修改文件,强烈建议使用它们,因为即使命令崩溃在执行中间,该文件也不会损坏。

它是因为重定向比其他命令具有更高的优先级。在这里,File1将在可以对其进行任何操作之前清空

file1.txt上试试>>而不是>>>将附加到文件,与>覆盖整个文件不同。尝试 -

    wc -l < file1.txt >> file1.txt

相关内容

最新更新