问题: 我正在尝试创建一个 Bash 脚本,从给定位置开始从历史记录中删除指定数量的条目。这个想法是为了更容易地以交互方式清理部分历史记录。
我尝试过的:
for loop
来删除某个范围内的条目,但在删除过程中我遇到了历史行移动的问题。然后我尝试将脚本设置为history -d
.bashrc
history -a
重新加载历史记录以保持条目同步。这也产生了不一致的结果,特别是当我尝试从较大历史范围中的特定位置删除时。
主要问题是脚本要么无法准确删除指定的行数,要么由于历史条目的变化而无法从正确的位置开始删除。我很感激任何有关如何创建稳定的 Bash 脚本的指导,该脚本始终删除从指定历史位置开始的选定数量的行。
我尝试过的:For Loop with
history -r
history -d
循环与 for
来删除特定范围的条目。例如,从历史上的某个位置开始,我尝试删除下一个指定的行数。但是,我遇到了随着条目被删除而历史行号发生变化的问题,这使得循环不可靠。
history -d
这种方法没有按预期工作,因为每次删除条目时历史行号都会发生变化,这使得循环不可靠。
N=10 # Number of lines to delete
START=50 # Starting position
for ((i=N-1; i>=0; i--)); do
history -d $((START + i))
done
.bashrc
,假设直接使用 shell 的历史记录可以提高可靠性。这允许部分删除,但仍然无法删除确切数量的条目,有时会返回“历史位置超出范围”错误。
.bashrc
:
.bashrc
这允许我以交互方式调用该函数,但我遇到了较大范围的问题,有时我会收到“历史位置超出范围”错误。
使用
delete_history_range() {
local N=$1
local START=$2
for ((i=N-1; i>=0; i--)); do
history -d $((START + i))
done
}
history -a
重新加载历史记录:我还尝试在每个删除命令之前和之后添加history -r
(将最近的命令附加到历史文件)和history -a
(重新加载它)。这样做的目的是使历史记录与 shell 的当前会话保持同步,但它会产生不一致的结果,特别是在范围较大的情况下。
我期望有一个
非交互式解决方案,可以从历史记录中删除确切数量的条目,从给定位置开始,无需手动输入。理想情况下,脚本能够可靠地处理删除条目时行编号的变化,而不会导致超出范围的错误。
Ps.:我在 Stack Overflow 上遇到了这个问题,它解决了使用脚本删除 Bash 历史记录中的最后一个条目的问题。然而,我的问题有点不同:我正在寻找一种从给定位置开始从历史记录中删除特定范围条目的方法。 我尝试了各种方法,但由于历史线转移和“超出范围”错误,我正在努力寻找可靠的解决方案。虽然另一个问题帮助我了解history -d如何适用于单个条目,但我需要一个可以处理从历史记录中的任意点开始删除指定范围内的多个条目的解决方案。
history -r
打印一系列历史条目
for i in $(seq 1734 -1 1729); do history -d "$i";done