bash_history
我想制作一个简单的脚本,根据用户输入的行号从中删除一行。
echo -n "Delete History Line Number: "
read num
history -d $num
错误是“历史位置超出范围”(它不应该是,我使用了一个范围内的数字)。
这为什么不起作用?
答案1
您的脚本无法按预期运行有两个原因:
- 正在运行的脚本的 bash 环境是“非交互式的”,并且没有启用历史记录功能。
- 正在运行的脚本的 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”来恢复历史记录将避免出现“超出范围”的错误。