如何在Byobu中获取指定窗格的zsh命令历史(支持窗格繁忙时操作)
如何在Byobu中获取指定窗格的zsh命令历史(支持窗格繁忙时操作)
刚好我之前也折腾过类似的需求,给你分享两个靠谱的办法,完全能在窗格跑着长命令的时候拿到它的历史,一点都不干扰:
方法一:给每个zsh分配独立历史文件(推荐)
这是最稳妥、无副作用的方案,核心思路是让每个Byobu窗格的zsh进程生成专属的历史文件,之后直接通过窗格PID定位读取即可:
第一步:配置zsh生成独立历史文件
打开你的~/.zshrc,添加以下内容:HISTFILE=~/.zsh_history_$$ SAVEHIST=10000 HISTSIZE=10000这里的
$$是zsh进程的PID,每个窗格的zsh启动时都会生成以自己PID命名的历史文件,比如~/.zsh_history_12345。保存后重启zsh或者执行source ~/.zshrc生效。第二步:获取目标Byobu窗格的zsh PID
Byobu是tmux的包装,用下面的命令可以列出所有窗格的ID和对应的进程PID:byobu list-panes -F "#{pane_id} #{pane_pid}"输出大概长这样:
%1 12345,其中%1是窗格的ID,12345就是这个窗格对应的zsh进程PID。第三步:读取指定窗格的历史
直接读取对应的历史文件就能拿到内容,要是想和history 1输出格式完全一致,用zsh来解析更准确:zsh -c "HISTFILE=~/.zsh_history_<ZSH_PID>; history 1"把
<ZSH_PID>换成你刚才拿到的PID就行,完全不会干扰那个正在跑长命令的窗格,因为只是读取本地文件而已。要是你之前习惯共享所有窗格的历史,还可以在
~/.zlogout里加一行,退出zsh时把当前窗格的历史合并到总文件:cat $HISTFILE >> ~/.zsh_history_all
方法二:用gdb从zsh进程内存读历史(进阶)
如果不想改zsh的历史配置,也可以直接从zsh进程的内存里导出历史,但这个方法需要系统允许进程attach,且zsh最好有调试符号:
- 先拿到目标窗格的zsh PID(用方法一里的
byobu list-panes命令) - 执行gdb命令导出历史:
这个命令会让zsh把当前内存里的历史输出到终端,不过要注意,有些系统的安全策略可能禁止gdb attach到运行中的进程,而且如果zsh没有调试符号的话可能执行失败,所以这个是备选方案。gdb -p <ZSH_PID> -batch -ex 'call zsh_history_dump()'
备注:内容来源于stack exchange,提问作者Ram Rachum
相关产品推荐
相关产品推荐

