tmux - 我可以在 tmux split 创建当前窗格的子外壳吗?
问题描述
这个问题很容易解释......我在 tmux 中有一个运行 bash 的窗格,我想拆分它,但是我不想运行新的 shell,而是希望新窗格成为第一个的子 shell。
解决方案
这是一种使用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 和适当的目录,所以这已经奏效了。
推荐阅读
- kubernetes - 即使在使用 initContainers 后,安装卷的权限也被拒绝?
- json - 在 Dataweave 中将 JSON 转换为 XML
- python - tensorflow.python.framework.errors_impl.AlreadyExistsError 训练 LSTM 模型时
- javascript - 如何动态追加类
- reactjs - 如何使用 docker 和 serve -s build 部署 React 应用程序
- javascript - 如何允许用户删除网站上的数据?
- arrays - 将嵌套数组快速解析为可解码模型
- python - 使用 load_table_from_dataframe 时出错
- amazon-web-services - AWS - 在 SNS 订阅或 Lambda 函数上设置死信队列有什么区别?
- javascript - Bootstrap 3 折叠块 - 显示方向