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