我在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