在过去的一两年里,我经常使用 sqlite3 进行 Web 开发项目。我总是会偶然发现一个问题,突然间,命令历史记录不再起作用(当按向上箭头时,您会获得命令历史记录,就像在 bash 中一样)。
供参考
我正在运行 Ubuntu 22.04.3 LTS (6.5.0-21-generic) 和 .NET Core 8.0.200
我尝试过的
我无法弄清楚这一点。
- 我检查了我的
~/.sqlite_history
文件,看起来很正常。 - 检查了
$SQLITE_HISTORY
env 变量,但我没有这个,它仍然有效(更多内容见下文) - 更新到最新版本的sqlite3(3.45.1 2024-01-30)
- 我研究了很多与此相关的问题,但仍然无法弄清楚为什么历史突然不起作用。
编辑 - 尝试过控制台应用程序,也导致问题
- 打开新终端
- 打开 sqlite3 数据库并测试历史命令 - 它有效。
- 退出 sqlite3 返回命令行(同一终端)
- 运行一个 .NET Core 控制台应用程序,该应用程序将“Hello, World”输出到控制台并退出。 (从 dotnet run 开始)
- 从步骤 2 打开相同的 sqlite3 数据库。尝试历史记录。历史记录在此终端窗口中不再有效。
终于发现问题的原因
我终于发现为什么sqlite3历史不起作用了。
但是,我不明白为什么这会导致问题。
要重现该问题,我必须:
- 启动 dotnet core web 应用程序示例:(
$ dotnet run --project myWebApi
) - 停止 webapi (CTRL-C)
- 启动 sqlite3 来检查我的数据库——此时我没有历史记录(向上推箭头没有提供任何结果)
问题的线索
如果我打开一个新终端并运行 sqlite3,那么我确实再次拥有历史记录。
dotnet core 应用程序正在像我一样运行,我认为那里没有发生任何奇怪的事情,但我不确定。
你知道为什么会发生这种情况吗?
答案1
终端有几组不同的箭头键按键序列。通常Up输入序列ESC [ A
,但有一个“应用键”模式,其中相同的键输入ESC O A
。
由于某种原因,Wine 和 dotnet 都倾向于激活此模式——也许作为其“控制台”抽象层的意外部分——然后忘记在退出时停用它。
(通常tput smkx
↔tput rmkx
应(取消)激活此模式。)
如果我没记错的话,后一个按键序列不仅仅是“向上箭头,在应用程序模式下”——有一个不同的终端恰好使用相同的序列“Ctrl-向上箭头”或类似的东西。所以无论出于什么原因,阅读线Bash 和各种其他程序(包括 sqlite)使用的输入库将此序列绑定到与常规“向上箭头/历史上一页”不同的操作。