首页 > 解决方案 > 我可以在 tmux split 创建当前窗格的子外壳吗?

问题描述

这个问题很容易解释......我在 tmux 中有一个运行 bash 的窗格,我想拆分它,但是我不想运行新的 shell,而是希望新窗格成为第一个的子 shell。

标签: tmux

解决方案


这是一种使用reptyr的方法,它有可能不适用于您的情况。您应该期望在您的系统的软件包中找到该实用程序。我使用以下脚本对其进行了测试:

xterm -e 'tmux new-session -s mysession' &
sleep 1
tmux split-window -v -t 0
sleep 1
tmux send-keys -t 0 'cd /tmp;V=1' Enter
tmux send-keys -t 1 'cd /usr;V=3' Enter
sleep 1
tmux send-keys -t 0 'V=2 bash' Enter
sleep 1
tmux send-keys -t 0 'echo $$; echo $$ >/tmp/pid' Enter
sleep 1
tmux send-keys -t 1 'exec reptyr $(</tmp/pid)' Enter
sleep 2
tmux send-keys -t 1 'echo $(pwd) $$ V=$V' Enter
tmux send-keys -t 0 'echo $(pwd) $$ V=$V' Enter

我们首先将运行 bash 的窗口分成两部分。在顶部窗格 (-t 0) 我们更改目录,并将环境变量 V 设置为值 1,在底部窗格中,我们更改为不同的目录并将 V 设置为 3,只是为了跟踪发生的情况。

然后在顶部窗格中,我们在其环境中启动一个 V=2 的子 bash,并将 pid 回显到一个文件中。

在底部窗格中,我们运行reptyr以附加到该 pid,然后在两个窗格中我们看到我们在哪里。

生成的输出终端如下所示:

$ cd /tmp;V=1
$ V=2 bash
$ echo $$; echo $$ >/tmp/pid
27236
$ 
[1]+  Stopped                 V=2 bash
$ echo $(pwd) $$ V=$V
/tmp 27184 V=1
$ 

----------------------------------------
$ cd /usr;V=3
$ exec reptyr $(</tmp/pid)
[-] Timed out waiting for child stop.
$ echo $(pwd) $$ V=$V
/tmp 27236 V=2
$ 

显然,底部窗格现在是我们在顶部窗格中启动的进程 27236,V=2 和适当的目录,所以这已经奏效了。


推荐阅读