该想法来自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 | # 使历史记录立即写入文件 |
这样可以确保每个 Shell 在执行新命令后立即将命令写入 ~/.bash_history
文件,并从其他 Shell 中读取最新的历史记录。
5. 总结
默认行为:每个 Shell 实例有自己的命令历史,历史记录只有在 Shell 退出后才会写入
~/.bash_history
文件。每个新 Shell 启动时只会读取文件中已有的历史记录,而不会与其他正在运行的 Shell 实时同步。解决方案:通过修改
~/.bashrc
中的配置,可以让多个 Shell 实时共享命令历史记录,这样在每个 Shell 中都能看到所有已执行的命令。