为什么‘history -s’会清除我的命令历史记录?

为什么‘history -s’会清除我的命令历史记录?

我正在开展一个项目,其中 STG 和 LIVE 环境有多个实例,包括一个中央“gfs”服务器,您可以在其中进行数据库管理

你可以通过“堡垒”服务器访问所有实例,但 ssh 两次,几乎总是到“gfs”,这让人很烦,所以我在 bash 配置文件中添加了一些快捷方式,这样!!当我登录到堡垒服务器时,就可以直接写入到 gfs

.bashrc我在堡垒服务器上向我的用户添加了这一行:

history -s 'gcloud compute ssh [some-instance] --internal-ip --ssh-flag="-o ServerAliveInterval=30"'

但此后,当我登录时,除了添加的命令外,所有以前的历史记录都会被删除。当我history -s [command]在交互式 shell 中运行时,它没有相同的行为。

有人知道可能是什么问题吗?

如果相关的话,问题就会出现在 Red Hat Enterprise v7.9 上。

答案1

我找不到任何关于如何以及何时确切地Bash 会加载历史文件(“当 shell 启动时,历史记录会被初始化……”并没有真正说明具体时间)。不过,我在 Bash 5.1.16 中的测试表明:

  1. 历史文件自动加载采购.bashrc

  2. 但前提是此时当前 shell 中的历史记录仍然为空。

在我看来,这不是一个糟糕的设计。以下是我的观察:

  • (1) 允许您轻松自定义 中的历史记录.bashrc,例如,您可以将其设置HISTFILE为非默认值,它就会正常工作。如果在设置 之前加载了默认历史记录文件HISTFILE,则需要一种机制或手动解决方案来丢弃刚刚加载的历史记录并加载正确的文件;这样不太优雅。

  • (2)允许您使用命令(可能是有条件的)“手动”构建历史记录.bashrc,而不必担心最终会以您无法轻易控制的方式附加其他内容。

history -s …压抑了(1),是因为(2)。

解决办法很简单:在之前.bashrc输入history -r(即加载历史文件)history -s …

history -r
history -s 'gcloud compute ssh [some-instance]  --internal-ip --ssh-flag="-o ServerAliveInterval=30"'

相关内容