为什么我不能使用此循环从 bash 历史记录中删除多个条目

Why can't I delete multiple entries from bash history with this loop

这个循环将显示我想做的事情,但是如果我从中删除 echo,它实际上不会删除任何东西:

history | grep ":[0-5][0-9] ls *$" | cut -c1-5 | 
while read id; do 
    echo history -d $id
done

我添加了缩进以使其更具可读性,但我 运行 它是命令行中的一行代码。

我设置了 HISTTIMEFORMAT 以便 grep 找到秒数后跟 ls 后跟任意数量的空格。本质上,它是在历史上寻找任何 ls.

这是在 Ubuntu 14.04.3 LTS

上使用 bash 4.3.11

history -d 从内存中的历史记录中删除一个条目,并且您 运行 它在管道诱导的子 shell 中。这意味着您要从子 shell 的历史记录中删除一个历史条目,而不是您当前 shell 的历史记录。

使用进程替换来提供循环:

while read id; do
    history -d "$id"
done < <(history | grep ":[0-5][0-9] ls *$" | cut -c1-5)

或者,如果您的 bash 版本足够新,请使用 lastpipe 选项确保您的 while 循环在当前 shell 中执行。

shopt -s lastpipe
history | grep ":[0-5][0-9] ls *$" | cut -c1-5 | 
while read id; do 
    echo history -d $id
done