读了一些帖子后,无法弄清楚如何history -d 1
在一个函数中不删除该条目。
下面的函数直接进入命令行:
function test () {
echo "HISTFILE: '${HISTFILE}'"
history -d 1
}
然后我们运行:
history -c
echo "to remove"
history
1 echo "to remove"
2 history
echo $(test)
HISTFILE: '/home/user/.bash_history'
history
1 echo "to remove"
2 history
3 echo $(test)
4 history
关于它如何不删除历史记录的第一个条目有什么想法吗?
答案1
该函数(顺便说一句,它重载了标准实用程序的名称,因此您可能应该更改它)正在命令替换(一个单独的子 shell)中运行。
在子 shell 中,它删除第一个历史记录条目。不过,它不会影响调用 shell 的历史记录。
首先,将函数重命名为其他名称test
(这不会修复错误,但test
已经是标准实用程序),然后停止使用echo $(some-command)
来输出命令或函数的输出。这是一种存在几个问题的反模式。直接使用函数名即可;它已经在做自己的输出了。
除了echo
不必要的命令替换之外,echo
如果输出包含反斜杠,则可能会更改命令输出。不带引号的命令替换还会导致 shell 在空格、制表符和换行符( 中的任何字符$IFS
)上拆分命令输出,并且会将文件名通配应用于拆分的单词。然后,该echo
实用程序将在一行上输出所有生成的单词,单词之间有空格。
有关的:
- 什么时候需要双引号?
- 为什么 printf 比 echo 更好?(与 的问题相关
echo
,但我绝对不是说您应该printf
在这种情况下使用!)