为什么这个 tmux 选项没有持久化?

为什么这个 tmux 选项没有持久化?

我希望每次启动特定 tmux 会话时都生成一个配置文件,并且我也bashrc想使用用户的默认 tmux 配置文件。在任何给定会话中创建的每个窗口/窗格都应重复使用此相同配置。${XDG_CONFIG_HOME}/tmux/tmux.conf

为了防止同时启动多个会话时出现竞争条件,我想避免每次移动/重新链接/等默认bashrc/配置文件,因为这看起来真的很麻烦。tmux.conf

相反,我尝试使用执行以下操作的动态配置文件来调用 tmux:

  1. 创建一个包含我生成的配置的临时文件bashrc(例如/tmp/bashrc.12345
  2. 在 tmux 中设置default-command类似于的选项bash --rcfile /tmp/bashrc.12345 [-i|-l|...] [ARGV...](取决于 tmux 的调用方式)
  3. 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 FOOFOO无论什么),根据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 中选项的整个机制是有点复杂

相关内容