我在 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 可以正常工作。