为什么我不能使用此循环从 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
这个循环将显示我想做的事情,但是如果我从中删除 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