【问题标题】:Why can't I delete multiple entries from bash history with this loop为什么我不能使用此循环从 bash 历史记录中删除多个条目
【发布时间】:2016-03-25 10:52:11
【问题描述】:

这个循环将显示我想要做的事情,但如果我从中删除 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

【问题讨论】:

    标签: linux bash ubuntu history


    【解决方案1】:

    history -d 从内存历史记录中删除一个条目,并且您在管道诱导的子外壳中运行它。这意味着您要从子 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
    

    【讨论】:

    • 嗯,似乎都不起作用。不过,您对为什么它不起作用的解释似乎是合理的。
    • 哦,对了。我的命令行的早期版本有一个反向排序来处理这个问题,但我没有把它放在我的问题中。一旦我这样做,它就可以正常工作。
    • 好 :) 我删除了我之前的评论,因为我不相信我已经充分验证了它。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-10-05
    • 1970-01-01
    • 1970-01-01
    • 2021-11-14
    • 2021-01-04
    • 1970-01-01
    • 2015-06-23
    相关资源
    最近更新 更多