如何创建 Bash 脚本以从给定位置开始从历史记录中删除特定数量的行?

问题描述 投票:0回答:1

问题: 我正在尝试创建一个 Bash 脚本,从给定位置开始从历史记录中删除指定数量的条目。这个想法是为了更容易地以交互方式清理部分历史记录。

我尝试过的:

  1. 我最初尝试使用
    for loop
    来删除某个范围内的条目,但在删除过程中我遇到了历史行移动的问题。
    然后我尝试将脚本设置为
  2. history -d
  3. 中的函数,以确保可以在交互式 shell 中直接访问历史记录。虽然这允许我删除条目,但该函数无法正确处理更大的范围或引发“历史位置超出范围”错误。
    另一种尝试涉及在删除命令之前和之后使用 
  4. .bashrc
  5. history -a
    重新加载历史记录以保持条目同步。这也产生了不一致的结果,特别是当我尝试从较大历史范围中的特定位置删除时。
    
    
当前挑战:

主要问题是脚本要么无法准确删除指定的行数,要么由于历史条目的变化而无法从正确的位置开始删除。我很感激任何有关如何创建稳定的 Bash 脚本的指导,该脚本始终删除从指定历史位置开始的选定数量的行。

我尝试过的:

For Loop with
    history -r
  1. :我尝试使用
    history -d
    循环与
    for
    来删除特定范围的条目。例如,从历史上的某个位置开始,我尝试删除下一个指定的行数。但是,我遇到了随着条目被删除而历史行号发生变化的问题,这使得循环不可靠。
    
    
  2. 这是我尝试使用带有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
    中的
  1. Bash 函数:为了将脚本保留在交互式 shell 中,我将其作为函数移至
    .bashrc
    ,假设直接使用 shell 的历史记录可以提高可靠性。这允许部分删除,但仍然无法删除确切数量的条目,有时会返回“历史位置超出范围”错误。
    
    
  2. 我还尝试直接将脚本添加为函数
.bashrc

:

.bashrc

这允许我以交互方式调用该函数,但我遇到了较大范围的问题,有时我会收到“历史位置超出范围”错误。

使用
    delete_history_range() { local N=$1 local START=$2 for ((i=N-1; i>=0; i--)); do history -d $((START + i)) done }
  1. history -a
    重新加载历史记录:我还尝试在每个删除命令之前和之后添加
    history -r
    (将最近的命令附加到历史文件)和
    history -a
    (重新加载它)。这样做的目的是使历史记录与 shell 的当前会话保持同步,但它会产生不一致的结果,特别是在范围较大的情况下。
    
    
我的期望:

我期望有一个

非交互式解决方案

,可以从历史记录中删除确切数量的条目,从给定位置开始,无需手动输入。理想情况下,脚本能够可靠地处理删除条目时行编号的变化,而不会导致超出范围的错误。

Ps.:

我在 Stack Overflow 上遇到了这个问题,它解决了使用脚本删除 Bash 历史记录中的最后一个条目的问题。然而,我的问题有点不同:我正在寻找一种从给定位置开始从历史记录中删除特定范围条目的方法。 我尝试了各种方法,但由于历史线转移和“超出范围”错误,我正在努力寻找可靠的解决方案。虽然另一个问题帮助我了解history -d如何适用于单个条目,但我需要一个可以处理从历史记录中的任意点开始删除指定范围内的多个条目的解决方案。

bash shell scripting history
1个回答
0
投票

history -r

打印一系列历史条目

for i in $(seq 1734 -1 1729); do history -d "$i";done

	
© www.soinside.com 2019 - 2024. All rights reserved.