我希望每次启动特定 tmux 会话时都生成一个配置文件,并且我也bashrc
想使用用户的默认 tmux 配置文件。在任何给定会话中创建的每个窗口/窗格都应重复使用此相同配置。${XDG_CONFIG_HOME}/tmux/tmux.conf
为了防止同时启动多个会话时出现竞争条件,我想避免每次移动/重新链接/等默认bashrc
/配置文件,因为这看起来真的很麻烦。tmux.conf
相反,我尝试使用执行以下操作的动态配置文件来调用 tmux:
- 创建一个包含我生成的配置的临时文件
bashrc
(例如/tmp/bashrc.12345
) - 在 tmux 中设置
default-command
类似于的选项bash --rcfile /tmp/bashrc.12345 [-i|-l|...] [ARGV...]
(取决于 tmux 的调用方式) source-file
我的用户默认tmux.conf
这看起来类似于下面的 shell 脚本:
#!/bin/bash
tmuxrc="${XDG_CONFIG_HOME}/tmux/tmux.conf"
bashrc=$( mktemp )
generate-bashrc > "${bashrc}"
# This is the tmux configuration file's final content
config="set-option -g default-command 'bash --rcfile \"${bashrc}\"' ; source-file '${tmuxrc}' ;"
# Reordering the statements makes no apparent difference
#config="source-file '${tmuxrc}' ; set-option -g default-command 'bash --rcfile \"${bashrc}\"' ;"
exec tmux -f <( echo "${config}" ) "${@}"
运行此脚本时,我可以看到我的默认 tmux 配置文件正在加载,应用我的布局/主题等等,但该default-command
选项肯定不像我预期的那样工作。
相反,我的默认 shell 已启动,当我使用 在 tmux 中打印当前选项时tmux show -sgwp
,它根本没有列出default-command
已定义!
编辑≈ 即使我在正在运行的 tmux 会话中运行
tmux set-option -g default-command FOO
(FOO
无论什么),根据tmux show -sgwp
为什么这个选项没有保留?
答案1
为什么这个选项没有保留?
当您意识到并记住 tmux 服务器和每个 tmux 客户端都是独立进程时,许多与 tmux 有关的问题就变得更容易理解了。在某些情况下,客户端会启动服务器。.tmux.conf
是针对服务器的,而不是针对客户端的。同样,-f
(指定备用配置文件)是针对服务器的。
将您的exec tmux -f <( echo "${config}" ) "${@}"
execs 发送到 tmux 客户端。客户端可能会启动 tmux 服务器,也可能不会。如果尚未启动服务器,它将启动服务器。如果它启动服务器,则将-f
正常工作。
在你的情况下,-f
第一个命令很重要tmux
,即找不到服务器并必须启动一个服务器的命令。你正在“同时启动多个会话”,因此你的后续tmux
命令将找到服务器,它们-f
将无关紧要。服务器可能会在稍后退出,如果你在此之后运行脚本,那么一切都将重新开始:一个tmux
命令将启动一个新的服务器,所以它-f
很重要;但只要服务器仍然存在,-f
您后续的调用tmux -f …
就无关紧要。
查看手动的[强调我的]:
-f file
指定备用配置文件。[…]tmux 在服务器进程启动时加载一次配置文件。该source-file
命令可用于稍后加载文件。
该命令tmux set-option -g default-command FOO
定义了一个全局会话选项。要查看全局会话选项,您需要tmux show -g
(即不带-s
, -w
, -p
)。tmux 中选项的整个机制是有点复杂。