输入和输出重定向到同一文件

时间:2015-04-27 15:18:35

标签: bash

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

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

4 个答案:

答案 0 :(得分:3)

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

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

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

  

它还通过将临时文件重命名为[...]

来原子地创建输出文件

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

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

答案 1 :(得分:2)

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

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

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

不幸的是,没有shell重定向等同于O_RDWR这样的模式。

您可以使用noclobber option 检查,但是无法使用shell重定向运算符打开文件进行读取和写入。您必须使用临时文件。

答案 2 :(得分:0)

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

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

这就是为什么某些命令可以为您执行此操作的选项(以免您必须自己使用command input > output && mv output input或类似的东西)。

答案 3 :(得分:-1)

我意识到这是十亿年前的事,但是我来到这里是在寻找tee之前寻找答案。也许我会忘记并在接下来的四年中偶然发现。

$ 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
相关问题