【问题标题】:basic bash command on Ubuntu: wc -l < file1.txt > file2.txt vs wc -l < file1.txt > file1.txt [duplicate]Ubuntu 上的基本 bash 命令: wc -l <​​ file1.txt > file2.txt vs wc -l <​​ file1.txt > file1.txt [重复]
【发布时间】:2019-03-18 12:36:55
【问题描述】:

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

wc -l < file1.txt > file2.txt 

file1 中的所有行都由wc 读取,并将编号保存到file2.txt

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

这种行为的原因是什么?

【问题讨论】:

    标签: linux bash shell ubuntu


    【解决方案1】:

    当您编写命令wc -l &lt; file1.txt &gt; file1.txt 时,您的shell 将首先读取整个命令并将标准输入、输出重定向到file1.txt

    然后,当使用&gt; 打开文件进行写入时,如果文件存在,它将被覆盖并创建一个空文件。然后进程(你的wc)将开始执行并写入其中直到执行结束。

    但是,您的 wc -l 必须读取文件并计算其中的行数,因为文件是空的(被覆盖),它只会转储到其中:

       0 file1.txt
    

    为了证明这一点,看看在使用 &gt;&gt; 的附加模式下会发生什么

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

    【讨论】:

      【解决方案2】:

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

      【讨论】:

      • 重定向根本不是命令;它们是命令的一部分,但它们确实在命令运行之前由shell处理。
      【解决方案3】:

      file1.txt 上尝试&gt;&gt; 而不是&gt;&gt;&gt; 将追加到文件不像 &gt; 覆盖整个文件。试一试——

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

      【讨论】:

        猜你喜欢
        • 2022-07-27
        • 1970-01-01
        • 2016-02-20
        • 2022-06-13
        • 1970-01-01
        • 1970-01-01
        • 2021-06-24
        • 2020-09-17
        • 2015-03-30
        相关资源
        最近更新 更多