【问题标题】:Input and output redirection to the same file [duplicate]输入和输出重定向到同一个文件[重复]
【发布时间】:2015-07-06 03:17:23
【问题描述】:

我一般如何将输入和输出重定向到同一个文件?我的意思是 -o 专门用于 sort 命令,并且各种命令可能还有其他此类选项。但是我通常如何在不破坏文件的情况下将输入和输出重定向到同一个文件?

例如:sort a.txt > a.txt 破坏了a.txt 文件内容,但我想将答案存储在同一个文件中。我知道我可以在使用临时文件后使用mvrm,但是可以直接使用吗?

【问题讨论】:

标签: bash


【解决方案1】:

BashPitfalls entry #13 中所述,您可以使用moreutils 中的sponge 在打开文件写入数据之前“吸收”数据。

示例用法: sort a.txt | sponge a.txt

虽然 BashPitfalls 页面提到可能会丢失数据,但海绵的手册页说

它还通过将临时文件重命名到位来自动创建输出文件 [...]

这不会比写入临时文件和执行mv 更危险。

感谢 Charles Duffy 指出 cmets 中的 BashPitfalls 条目。

【讨论】:

    【解决方案2】:

    如果您熟悉 POSIX api,您会发现 opening a file 有几种可能的模式,但最常见的模式是读取、写入和附加。你会记得,如果你打开一个文件进行写入,你会立即截断它。

    重定向直接类似于那些常见的模式。

     > x # open x for writing
     < x # open x for reading
    >> x # open x for appending
    

    不幸的是,没有与 O_RDWR 等模式等效的 shell 重定向。

    您可以使用noclobber option 对此进行检查,但您无法使用shell 重定向操作符打开文件进行读写。您必须使用临时文件。

    【讨论】:

      【解决方案3】:

      如果命令不支持在完成后执行 mv 本身,则不会。

      shell 在运行您告诉它运行的命令之前会截断输出文件。 (用一个不存在的命令试试,你会看到它仍然被截断。)

      这就是为什么某些命令可以选择为您执行此操作的原因(以使您不必自己使用command input &gt; output &amp;&amp; mv output input 或类似名称)。

      【讨论】:

        【解决方案4】:

        我意识到这是十亿年前的事情,但在我意识到tee 之前,我来到这里寻找答案。也许再过 4 年我会忘记并偶然发现这一点。

        $ for task in `cat RPDBFFLDQFZ.tasks | shuf -n 5`; do
        echo $task;
        grep -v $task RPDBFFLDQFZ.tasks | tee RPDBFFLDQFZ.tasks > /dev/null
        done
        6551a1fac870
        26ab104327af
        d6a90cf1720f
        9eaa4faea92f
        45ebf210a1b6
        

        【讨论】:

        • 您认为像这样使用tee command 可以达到什么效果?
        猜你喜欢
        • 2011-05-24
        • 2014-03-03
        • 2012-11-15
        • 2014-07-01
        • 2016-11-27
        • 1970-01-01
        • 1970-01-01
        • 2021-11-04
        • 1970-01-01
        相关资源
        最近更新 更多