我希望从 screen 切换到 tmux 以满足终端多路复用需求,但 screen 的一项功能需要在 tmux 中复制:-X 选项,该选项允许在现有 screen 会话中运行任意 screen 命令。这允许我修改正在运行的屏幕会话的环境以指向新的 X 服务器,因为我的屏幕会话往往比我的 X11 登录寿命更长。例如,我可以screen -X setenv DISPLAY $DISPLAY
在 X11 启动脚本中添加一些内容。
不管怎样,tmux 有没有办法将任意命令发送到正在运行的 tmux 会话?或者,在正在运行的 tmux 中更新环境变量的方法也是可以接受的。
答案1
它只是tmux
,可选择-t
选择一个会话的选项(对应于-S
屏幕)。
tmux set-environment DISPLAY $DISPLAY
答案2
回答有关更新环境的问题部分:多路复用器默认情况下,在创建或重新附加会话时会从客户端环境继承某些变量。
从联机帮助页:
更新环境会话选项可用于在创建新会话或重新连接旧会话时从客户端更新会话环境。
默认值为“DISPLAY SSH_ASKPASS SSH_AUTH_SOCK SSH_AGENT_PID SSH_CONNECTION WINDOWID XAUTHORITY”。
DISPLAY
因此,在重新连接会话时,您无需执行任何操作即可获取更新的设置。
请注意,这仅对新的您在旧会话中创建的窗口或窗格,但是不是现有的窗户。
答案3
如果您希望为 tmux 会话中的每个 shell 进程自动更新 $DISPLAY,您可以查看我的解决方案: https://www.reddit.com/r/tmux/comments/cd3jqw/automatically_update_display_for_each_tmux_pane/
总结一下:
将行添加到 tmux.conf
set-hook -g client-attached 'run-shell /bin/update_display.sh'
创建脚本/bin/update_display.sh:
# tmux will only send-keys to the following active processes
shell_grep="bash|zsh"
# Update $DISPLAY for each tmux pane that is currently running one of the $shell_grep processes
tmux list-panes -s -F "#{session_name}:#{window_index}.#{pane_index} #{pane_current_command}" | \
grep -E $shell_grep| \
cut -f 1 -d " " | \
xargs -I PANE tmux send-keys -t PANE 'eval $(tmux showenv -s DISPLAY)' Enter