从 Bash 脚本调用历史记录时出现“历史记录位置超出范围”

从 Bash 脚本调用历史记录时出现“历史记录位置超出范围”

bash_history我想制作一个简单的脚本,根据用户输入的行号从中删除一行。

echo -n "Delete History Line Number: "
read num
history -d $num

错误是“历史位置超出范围”(它不应该是,我使用了一个范围内的数字)。

这为什么不起作用?

答案1

您的脚本无法按预期运行有两个原因:

  1. 正在运行的脚本的 bash 环境是“非交互式的”,并且没有启用历史记录功能。
  2. 正在运行的脚本的 bash 环境与您交互工作的环境无关。

根据您的使用情况,最简单的解决方案可能是获取脚本,而不是执行。请参阅SU 帖子解释了采购和执行的区别了解更多信息。

答案2

通过源方法其工作,

我的源文件包含

# cat /root/source_file.sh
#!/bin/bash
history -d $1

和我的主文件有以下几行

# cat /root/master_file.sh
#!/bin/bash
if [ "$1" == "" ]; then
echo -e "Enter command number from history(syntax: source script_name.sh xxxx)"
else
source /root/source_file.sh && echo -e "Line number $1 removed successfully"

我们现在可以测试脚本了,

# source /root/master_file.sh
Enter command number from history(syntax: source script_name.sh xxxx)

好的,让我们添加行号

# history | tail -n 10
 1193  grep disable /etc/sysconfig/selinux
 1194  grep enforce /etc/sysconfig/selinux
 1195  sestatus
 1196  arch
 1197  uname -r
 1198  uname -a
 1199  history
 1200  history | tail -n 10
 1201  pwd
 1202  history | tail -n 10

让我们删除第 1196 行

# source /root/master_file.sh 1196
Line number 1196 removed successfully

 

# history | tail -n 10
 1194  grep enforce /etc/sysconfig/selinux
 1195  sestatus
 1196  uname -r
 1197  uname -a
 1198  history
 1199  history | tail -n 10
 1200  pwd
 1201  history | tail -n 10
 1202  source /root/master_file.sh 1196
 1203  history | tail -n 10

答案3

如果在循环期间发生“历史位置超出范围”,则此解决方案可能会有所帮助:

以下命令将反转历史命令的输出:

history | tac

在 for 循环中使用它来删除所有包含“YOUR_SEARCHSTRING”的历史命令:

for ln in $( history | tac | grep "YOUR_SEARCHSTRING" | cut -f2 -d' '); do history -d $ln; done

使用“tac”来恢复历史记录将避免出现“超出范围”的错误。

相关内容