为什么在运行 dotnet core Web 应用程序后我的 sqlite3 历史记录不起作用?

为什么在运行 dotnet core Web 应用程序后我的 sqlite3 历史记录不起作用?

在过去的一两年里,我经常使用 sqlite3 进行 Web 开发项目。我总是会偶然发现一个问题,突然间,命令历史记录不再起作用(当按向上箭头时,您会获得命令历史记录,就像在 bash 中一样)。

供参考

我正在运行 Ubuntu 22.04.3 LTS (6.5.0-21-generic) 和 .NET Core 8.0.200

我尝试过的

我无法弄清楚这一点。

  • 我检查了我的~/.sqlite_history文件,看起来很正常。
  • 检查了$SQLITE_HISTORYenv 变量,但我没有这个,它仍然有效(更多内容见下文)
  • 更新到最新版本的sqlite3(3.45.1 2024-01-30)
  • 我研究了很多与此相关的问题,但仍然无法弄清楚为什么历史突然不起作用。

编辑 - 尝试过控制台应用程序,也导致问题

  1. 打开新终端
  2. 打开 sqlite3 数据库并测试历史命令 - 它有效。
  3. 退出 sqlite3 返回命令行(同一终端)
  4. 运行一个 .NET Core 控制台应用程序,该应用程序将“Hello, World”输出到控制台并退出。 (从 dotnet run 开始)
  5. 从步骤 2 打开相同的 sqlite3 数据库。尝试历史记录。历史记录在此终端窗口中不再有效。

终于发现问题的原因

我终于发现为什么sqlite3历史不起作用了。

但是,我不明白为什么这会导致问题。

要重现该问题,我必须:

  1. 启动 dotnet core web 应用程序示例:( $ dotnet run --project myWebApi)
  2. 停止 webapi (CTRL-C)
  3. 启动 sqlite3 来检查我的数据库——此时我没有历史记录(向上推箭头没有提供任何结果)

问题的线索

如果我打开一个新终端并运行 sqlite3,那么我确实再次拥有历史记录。

dotnet core 应用程序正在像我一样运行,我认为那里没有发生任何奇怪的事情,但我不确定。

你知道为什么会发生这种情况吗?

答案1

终端有几组不同的箭头键按键序列。通常Up输入序列ESC [ A,但有一个“应用键”模式,其中相同的键输入ESC O A

由于某种原因,Wine 和 dotnet 都倾向于激活此模式——也许作为其“控制台”抽象层的意外部分——然后忘记在退出时停用它。

(通常tput smkxtput rmkx应(取消)激活此模式。)

如果我没记错的话,后一个按键序列不仅仅是“向上箭头,在应用程序模式下”——有一个不同的终端恰好使用相同的序列“Ctrl-向上箭头”或类似的东西。所以无论出于什么原因,阅读线Bash 和各种其他程序(包括 sqlite)使用的输入库将此序列绑定到与常规“向上箭头/历史上一页”不同的操作。

相关内容