为何新终端标签页中添加到bash历史的命令无法显示?
你的命令gnome-terminal -t foo -- bash -i -c 'history -s ls; bash'达不到预期,核心原因是两个bash进程的历史完全独立,具体拆解:
第一层bash的历史操作无法被继承
你通过bash -i -c启动的第一个bash是交互式进程,history -s ls确实会把ls添加到这个bash的内存历史中,但紧接着启动的第二个全新bash进程(也就是你实际操作的终端shell),会独立读取~/.bash_history文件加载自身的内存历史,不会继承父bash的内存历史内容,所以ls不会出现在新终端的历史里。-c模式下的命令不会被记录
第一层bash执行的history -s ls; bash是通过-c参数传递的,默认不会被记录到该bash的历史中;同时这个bash进程还在后台等待第二层bash退出,它的内存历史也不会写入~/.bash_history文件,所以你也看不到这条命令。PageUp访问的是第二层bash的独立历史
新终端按PageUp时,读取的是第二层bash的内存历史,它仅来自启动时加载的~/.bash_history,完全不包含第一层bash的任何操作。
要让指定命令出现在新终端的bash历史中,需让目标交互式bash自身执行历史添加操作,推荐两种方式:
- 方式一:用
--rcfile指定临时配置,让bash启动时自动执行历史添加
gnome-terminal -t foo -- bash --rcfile <(echo 'history -s ls') -i
这个命令会启动交互式bash,先执行临时rc文件里的history -s ls,把ls添加到当前shell的内存历史中,按PageUp就能看到它作为最后一条历史命令。
- 方式二:先执行命令再替换当前进程为交互式bash(适合需要先执行实际命令的场景)
gnome-terminal -t foo -- bash -i -c 'ls; history -s ls; exec bash'
这里用exec bash替换直接启动子bash,让当前bash进程替换为新的交互式bash,保留之前history -s ls的内存历史。
内容的提问来源于stack exchange,提问作者ldrahnik

