这个循环将显示我想要做的但是如果我echo
从中删除它,它实际上不会删除任何东西:
history | grep ":[0-5][0-9] ls *$" | cut -c1-5 | while read id; do echo history -d $id done
我添加了缩进以使其更具可读性但我从命令行运行它作为单行.
我已HISTTIMEFORMAT
设置,所以grep找到后跟秒后跟ls
任意数量的空格.从本质上讲,它在历史中发现的只是一个ls
.
这是使用bash 4.3.11
上Ubuntu 14.04.3 LTS
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