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

时间:2019-03-18 12:36:55

标签: linux bash shell ubuntu

当我戴上终端机时,我正在Ubuntu上测试基本的bash命令

wc -l < file1.txt > file2.txt 

文件wc读取文件1中的所有行,并将数字保存到file2.txt

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

此行为的原因是什么?

3 个答案:

答案 0 :(得分:2)

编写命令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选项,可在命令运行期间修改文件,因此强烈建议使用它们,因为即使命令在执行过程中崩溃,文件也不会损坏。

答案 1 :(得分:0)

这是因为重定向比其他命令具有更高的优先级。 在这里file1将被清空,然后才能对其执行任何操作

答案 2 :(得分:0)

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

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