当我戴上终端机时,我正在Ubuntu上测试基本的bash命令
wc -l < file1.txt > file2.txt
文件wc
读取文件1中的所有行,并将数字保存到file2.txt
。
但是,如果我使用类似的命令wc -l < file1.txt > file1.txt
,但是我尝试将其保存在相同的> file1
中,则输出始终为0
。
此行为的原因是什么?
答案 0 :(得分:2)
编写命令wc -l < file1.txt > file1.txt
时,您的外壳程序将首先读取命令整体,并将标准输入,输出从file1.txt
重定向到{1}。
然后,当使用>
打开文件进行写操作时,如果存在该文件,它将被覆盖并创建一个空文件。然后,该过程(您的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