在 Bash 中,如果在源脚本中写入“set -o history”从不、一次、两次、三次:Bash 的正确行为是什么?

在 Bash 中,如果在源脚本中写入“set -o history”从不、一次、两次、三次:Bash 的正确行为是什么?

我在 Kubuntu 20.04 和 KNOPPIX 9.1 中使用 bash v590。在 KDE 的 Konsole 下,许多终端仿真器 xterm-256color 正在运行,每个终端仿真器中都有一个 shell bash。

在这样的 shell 中,会运行一个很长的脚本。有时这个脚本会执行另一个脚本。

几年来一切都进展顺利。

现在我正在做一些扩展。因此发生了错误,bash 的基本错误行为。

多天以来,我一直在寻找我的代码更改的原因以及它们之间的关系。

重点是:什么被写入了 bash 历史列表。

我已将 HISTSISIZE 设置为 -1,将 HISTFILESIZE 设置为自纪元以来的秒数。

我取消设置了 HISTCONTROL 和 HISTIGNORE。

在每次测试运行时,我都会列出并设置所有与历史相关的 bash“set”选项和“shopt”选项。

事实证明,(或其中之一)实现

set -o history

是关键问题。

或许即使我不做设置而只是进行询问。

bash 的错误行为表现在两个不同的方面:

历史记录列表中不会写入任何内容,只有我写入的内容

history -s "abc"

或者将所有以井号(“#”)开头的行视为注释,写入历史列表。

这取决于代码行的频率

set -o history

存在。

例如,如果在父 shell 中设置了此项,则源脚本还会引入此行。

(如所述:可能仅适用于请求,无论是否设置)

我在互联网上搜索过但没有找到与此相关的内容。

请问有人知道这件事吗?


==附录_1 04.01.2023:

很奇怪:

A:

在另一个现有的终端(仅用于测试)中,开始时 shell bash 出现了与上述相同的错误效果。

然后我在父 shell 中关闭了“历史记录”

set +o history

因此

set -o | grep history

显示出这一点。

在我的测试脚本中,该脚本正在运行

我还做了

set +o history

因此

set -o | grep history

显示出这一点。

现在,注释掉的行不再写入 bash 历史列表。

并且命令“date”被写入历史列表。

即行为应该是通过设置历史记录

set -o history

乙:

在 Konsole 中,我创建了一个新的、带有终端和 shell bash 的附加窗口。

set -o | grep history

显示已开启。

我使用我的测试脚本。我没有做任何有关设置..历史的事情。

我运行这个脚本

set -o | grep history

显示已开启。

测试脚本正常、正确地将命令写入历史列表,但没有写入注释。

现在我改变测试脚本:我添加

set -o history

现在出现了错误行为:除了命令之外,用井号“#”注释掉的行也会被写入历史列表,例如“日期”。

不仅测试脚本,从那时起父 shell 也出现了这种错误行为。

请问,原因是什么,我该如何修复系统。

我不想重新启动。KDE 及其 Konsole 无法保存我的所有设置。在 Konsole 下对窗口和终端进行所有设置是一项艰巨的工作,而且我还没有找到存储所有设置的方法。


==附录_2 04.01.2023:

有没有办法在我运行一个长脚本之前或者至少在脚本开始时检查 bash 是否会正常运行或者是否会行为不当。

由于当 bash 出现错误时,会将大量非命令行写入历史列表,导致历史列表被塞满。查找和删除这些行是一项艰巨的工作。

答案1

对于 bash 的两种不良行为之一,与

set -o history
set +o history

我找到了一个适合我的解决方案。

更详细地说,这意味着:

一个不好的行为是,bash 有时不会将命令写入历史列表,尽管它应该这样做。

另一个不好的行为是,有时 bash 会将注释掉的行写到历史列表中,就像它们是命令一样。这似乎可以通过 HISTIGNORE 来控制。

对于第一个问题我的方法是:

(1)

在 shell 脚本的开头和其他位置,通过读取历史记录行来测试测试命令是否已写入历史记录

history n

fc -l histindex_1 histindex_2

如果比较结果有误,则

(2)

在 for 循环中应用十次

set +o history

检查后申请一次

set -o history

此后,在某个未知的时间内,bash 可以正常工作。

相关内容