首页 > 解决方案 > 如何在linux bash中删除范围内的历史记录

问题描述

在我的 Pi 上玩弄 Linux 并遇到了这个问题。我发现您可以使用命令删除某行,history -d linenumber但如果我想删除一个范围(我认为这更实用)怎么办?所以我查找了如何在几个地方循环。两种循环方式都适用于回显,但不适用于历史命令。我认为这是因为“历史”实际上不是命令。但为什么这很重要?有没有一种简单的方法可以做到这一点?我从来不知道在 Linux bash 中循环是可能的,所以现在我很好奇!这是我所做的:

pi@raspberry:~$ for ((i=258;i<=262;++i)); do "history -d $i"; done;// 由于引号,这是不正确的,给出: -bash: history -d 258: command not found -bash: history -d 259: command not found -bash: history -d 260: command not found -bash: history -d 261: command not found -bash: history -d 262: command not found

下面应该有效(但它没有):

pi@raspberry:~$ for i in {5..10}; do history -d $i; done; -bash: history: 5: history position out of range

我在这里找到了一篇文章:https ://superuser.com/questions/649859/history-position-out-of-range-when-calling-history-from-bash-script

......但他们根本不清楚,并说它需要采购而不是执行,这对我来说实际上没有任何意义。如果不能通过命令行完成,请直说。否则,我将重温 Python,如果这是一种合乎逻辑的方式,很高兴知道。

谢谢

标签: bashloopsfor-loophistory

解决方案


for ((i=258;i<=262;++i)); do "history -d $i"; done;

正如你所说,由于引号而根本不起作用

for i in {5..10}; do history -d $i; done;

正在工作,但您必须确保有从 5 到 10 的条目,在您的示例中,您没有。
考虑到您删除的每个项目,其他项目的位置索引都会缩小一个。

基本上你应该反转循环项目:

for i in {10..5}; do history -d $i; done;

在循环时不受位置索引更改的影响。

编辑
正如赛勒斯所建议的,还有另一种方法。
您想从 258 到 262 删除项目,总共 5 个条目(包括 262)
您可以删除位置 258 的条目 5 倍
。利用每次删除一个项目时索引缩小一个:

  • 第一次,您删除项目 258
  • 第二次,您删除了已缩减为 258 的 ex-item 259
  • 第三次,您删除 ex-ex-item 260,它已缩减为 259(在第一次删除中)和 258(在第二次删除中)
  • 第四次,您删除 ex-ex-ex-item 261,它已按比例缩小到 260(在第一次删除中)、259(在第二次删除中)和 258(在第三次删除中)
  • 第五次,您删除 ex-ex-ex-ex-ex-item 262...

推荐阅读