Kli*_*lik 5 command-line bash scripts
该脚本可以在这里找到:https : //stackoverflow.com/questions/14750650/how-to-delete-history-of-last-10-commands-in-shell
为方便起见,这里是:
for x in `seq $1 $2`
do
history -d $1
done
Run Code Online (Sandbox Code Playgroud)
我把它放在我的包含目录(我已经添加到 PATH 中的一个)中,在那里我运行了我编写的许多其他脚本并且工作得很好。
这不会产生从我的历史记录中删除行的预期结果,实际上它什么也不做。
知道为什么 history 命令不起作用吗?我想知道它是否与目录有关。
附加信息:
我玩弄代码并尝试了不同的变体。如果我echo在history命令前面放一个并运行它,我会得到以下输出:
cgravel@scspc578:~$ idelhistory 300 305
history -d 300
history -d 301
history -d 302
history -d 303
history -d 304
history -d 305
cgravel@scspc578:~$
Run Code Online (Sandbox Code Playgroud)
所以,对我来说,它似乎应该可以完美运行。我不明白为什么。此脚本从 /$HOME/Scripts/ 运行,并且已包含在 PATH 中。我也尝试使用 sudo 运行它,但没有任何变化。
Gil*_*il' 11
一句话:它不起作用,因为你没有正确调用它。
首先,由于您的脚本不是以 开头#!/bin/bash,因此它实际上不是 bash 脚本。它由哪个 shell 执行取决于您如何调用它。当您从 bash 命令行调用它时,bash 会派生出一个自己的新实例(无论如何,执行任何外部命令都必须这样做),并且正是这个新实例执行脚本。因此,脚本使用与父 shell 相同的设置(包括迄今为止的历史记录)执行。它是用不同的选项执行的;特别是,脚本中的命令的历史跟踪是关闭的(这适合您,否则它会添加到您要修改的历史记录中)。
执行脚本的 bash 实例是否设置了HISTFILE变量取决于它是否在父级中导出(这有点奇怪)。如果未导出并因此在子脚本中设置,则子脚本在结束时将不会保存修改后的历史记录。
如果HISTFILE导出,则子脚本将修改您的历史文件。但是,除非您已将交互式 shell 配置为在每个命令之后重新加载历史记录,否则修改后的历史记录只会被新启动的 bash 实例获取。
如果要运行影响当前 shell 实例的 shell 片段,则必须在当前 shell 实例中运行该 shell,而不是将其作为 subprocess 运行。如果您想做其他影响 shell 进程本身的事情,例如更改目录、设置变量等,您会遇到类似的问题。 使用.(“dot”) 或source内置命令在当前 shell 进程中运行脚本.
. idelhistory 300 365
Run Code Online (Sandbox Code Playgroud)
或者,您可以将其定义为.bashrc.