bash:带有history -d的函数不会删除历史条目

bash:带有history -d的函数不会删除历史条目

读了一些帖子后,无法弄清楚如何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实用程序将在一行上输出所有生成的单词,单词之间有空格。

有关的:

相关内容