当不小心将文件粘贴到 shell 中时,它会在 bash 历史记录中放入大量丑陋的无意义条目。有没有一种干净的方法来删除这些条目?显然我可以关闭 shell 并.bash_history
手动编辑文件,但也许有某种 API 可用于修改当前 shell 的历史记录?
答案1
命令提示符中的这一行就会有所帮助。
for i in {1..N}; do history -d START_NUM; done
其中 START_NUM 是历史记录中条目的起始位置。 N 是您可能要删除的条目数。
前任:for i in {1..50}; do history -d 1030; done
答案2
从 开始bash-5.0-alpha
,该history
命令现在采用删除 ( ) 选项的范围-d
。看拉斯塔文件的回答。
对于旧版本,解决方法如下。
您可以使用history -d offset
内置命令可从当前 shell 历史记录中删除特定行,或history -c
清除整个历史记录。
如果您想删除一系列行,那么它并不实际,因为它只需要一个偏移量作为参数,但您可以将其包装在带有循环的函数中。
rmhist() {
start=$1
end=$2
count=$(( end - start ))
while [ $count -ge 0 ] ; do
history -d $start
((count--))
done
}
用 来调用它rmhist first_line_to_delete last_line_to_delete
。 (根据输出的行号history
。)
(用于history -w
强制写入历史文件。)
答案3
根据的手册页重击 5.x, history
内置命令现在也采用范围:
-d offset
删除该位置的历史记录
offset
。如果offset
为负数,它被解释为相对于比最后一个历史位置大1的索引,因此负索引从历史记录的末尾开始倒数,索引-1指的是当前history -d
命令。
-d start-end
删除仓位之间的历史记录
start
和end
, 包括的。正值和负值start
和end
的解释如上所述。
但history --help
目前(截至 v5.2.21)并未反映这一点:
Options:
-c clear the history list by deleting all of the entries
-d offset delete the history entry at position OFFSET. Negative
offsets count back from the end of the history list
-a append history lines from this session to the history file
...
例如,history -d 2031-2034
一次删除四行。您可以使用$HISTCMD
从最新行开始删除氮线向后。
您还可以使用 导出history -w tmpfile
,然后编辑该文件,使用 清除history -c
,然后使用 读回history -r tmpfile
。无需写信.bash_history
(直接)。
答案4
arghistory -d
接受一个范围,并且$HISTCMD
是历史记录中的最大数字。
此函数用于n
从历史记录中删除最后的条目(只需传入要删除的历史命令的数量,例如rmhist 5
:
$ rmhist() { history -d $(($HISTCMD - $1))-$HISTCMD ;}
或者..使用这样的参数来从历史记录(包括)或最后的“n”个命令中删除:
rmhist() {
case $1 in
--from|from) local start=$2; ;;
--last|last) local start=$(($HISTCMD - $2)) ;;
*) echo "Try rmhist --from # or rmhist --last n "; return ;;
esac;
history -d ${start}-${HISTCMD}
}
结果看起来像这样:
5778 ls /etc
5779 ls /tmp
5780 ls /dev
5781 ll
5782 cd /tmp
5783 cd
5784 history
(base) ~ $ rmhist --last 3
(base) ~ $ history 5
5778 ls /etc
5779 ls /tmp
5780 ls /dev
5781 ll
5782 history 5
(base) ~ $ rmhist --from 5780
(base) ~ $ history 5
5776 history 10
5777 ls
5778 ls /etc
5779 ls /tmp
5780 history 5