Linux:如何同时使用文件作为输入和输出?

Linux:如何同时使用文件作为输入和输出?

我刚刚在 bash 中运行以下命令:

uniq .bash_history > .bash_history

我的历史文件最终完全为空。

我想我需要一种方法在写入之前读取整个文件。怎么做?

PS:我显然想到了使用临时文件,但我正在寻找更优雅的解决方案。

答案1

我建议sponge使用更多工具. 来自手册页:

DESCRIPTION
  sponge  reads  standard  input  and writes it out to the specified file. Unlike
  a shell redirect, sponge soaks up all its input before opening the output file.
  This allows for constructing pipelines that read from and write to the same 
  file.

要将其应用于您的问题,请尝试:

uniq .bash_history | sponge .bash_history

答案2

echo "$(uniq .bash_history)" > .bash_history

应该会有预期的结果。子 shell 在.bash_history打开进行写入之前执行。如Phil P 的回答,在原始命令中读取时.bash_history,它已被截断>操作员

答案3

另一个无需使用 的技巧sponge是使用以下命令:

{ rm .bash_history && uniq > .bash_history; } < .bash_history

这是优秀文章中描述的作弊方法之一“就地”编辑文件在 backreference.org 上。

它基本上打开文件进行读取,然后“删除”它。但它并没有真正被删除:有一个打开的文件描述符指向它,只要它保持打开状态,文件就仍然存在。然后它创建一个同名的新文件,并将唯一的行写入其中。

此解决方案的缺点:如果uniq由于某种原因失败,您的历史记录将会消失。

答案4

使用海绵更多工具

uniq .bash_history | sponge .bash_history

相关内容