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

Ste*_*sku 2 linux bash ubuntu history

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

history | grep ":[0-5][0-9] ls *$" | cut -c1-5 | 
while read id; do 
    echo history -d $id
done
Run Code Online (Sandbox Code Playgroud)

我添加了缩进以使其更具可读性但我从命令行运行它作为单行.

我已HISTTIMEFORMAT设置,所以grep找到后跟秒后跟ls任意数量的空格.从本质上讲,它在历史中发现的只是一个ls.

这是使用bash 4.3.11Ubuntu 14.04.3 LTS

che*_*ner 5

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

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

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

或者,如果您的版本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
Run Code Online (Sandbox Code Playgroud)