shell的历史命令机制
arch3rn4r

该想法来自chroot实验

使用新方法建立bash后,我查看“上一条命令”,既按箭头”⋀“,出现的指令并不是当前界面下的历史命令

比如shell1,我的命令是cd .. cat flag.txt shell2,我之前使用的命令是gcc -o 1 1.c ./1

在shell1里使用vi新建shell后,再按”⋀“,出现的指令不是cat flag.txt 而是 ./1

我知道是“新建”了一个shell,但这些历史命令是怎样被分配到各个shell里的呢

1. Shell 的历史记录机制

在 Linux 和 Unix 系统中,命令历史记录由每个 Shell 实例独立管理,每个 Shell 会维护自己的命令历史,通常存储在用户的 ~/.bash_history 文件中。然而,这个文件只有在 Shell 退出时才会写入,因此每个运行的 Shell 实例在其运行期间拥有独立的命令历史。

  • Shell 启动:当你启动一个新的 Bash 实例时,它会从 ~/.bash_history 文件中加载命令历史记录,这个历史记录是上次退出的 Bash 实例保存的内容。如果你在多个 Shell 中工作,每个 Shell 在退出时会将它们的命令历史追加到同一个历史文件中。

  • 当前 Shell 的历史记录:在一个 Shell 中,你可以通过按方向键 Up)访问该 Shell 的命令历史,这些历史命令仅限于当前 Shell 的会话。当你在 Shell1 执行了某些命令(如 cd ..cat flag.txt),这些命令只会保留在该 Shell 的命令历史中。

2. 新建 Shell 实例的行为

  • 当你在 Shell1 中通过 vi 或其他方式启动一个新的 Bash Shell(Shell2),这个新的 Shell 会从 ~/.bash_history 中读取最近的命令历史,但它不会包含当前正在运行的其他 Shell 的实时历史。它只会载入上一次退出 Shell 时保存的命令记录。

  • 例如,你在 Shell2 中按 键时,看到的是 gcc -o 1 1.c ./1,这是因为这个命令在 ~/.bash_history 文件中被保存过,而 cat flag.txt 尚未被写入 ~/.bash_history,因为 Shell1 仍然在运行,并且没有退出。

3. 历史记录在不同 Shell 之间的共享

  • 默认情况下,每个 Bash 实例的历史记录都是独立的,只有在当前 Shell 退出时,它的命令历史才会追加到 ~/.bash_history 中。不同 Shell 之间的历史记录不会实时同步,因此你在 Shell1 中运行的命令(如 cat flag.txt)在 Shell1 退出之前,不会对其他 Shell 可见。

4. 如何让多个 Shell 共享实时历史记录

为了在多个 Shell 实例之间共享实时历史记录,可以使用以下设置来配置 bash 的历史记录行为:

~/.bashrc 文件中添加以下内容:

1
2
3
4
5
6
# 使历史记录立即写入文件
shopt -s histappend
PROMPT_COMMAND='history -a; history -n'

# `history -a` 将新命令追加到历史文件中
# `history -n` 从历史文件中读取新命令

这样可以确保每个 Shell 在执行新命令后立即将命令写入 ~/.bash_history 文件,并从其他 Shell 中读取最新的历史记录。

5. 总结

  • 默认行为:每个 Shell 实例有自己的命令历史,历史记录只有在 Shell 退出后才会写入 ~/.bash_history 文件。每个新 Shell 启动时只会读取文件中已有的历史记录,而不会与其他正在运行的 Shell 实时同步。

  • 解决方案:通过修改 ~/.bashrc 中的配置,可以让多个 Shell 实时共享命令历史记录,这样在每个 Shell 中都能看到所有已执行的命令。

 评论
评论插件加载失败
正在加载评论插件
由 Hexo 驱动 & 主题 Keep
总字数 39.3k 访客数