如何使用 tmux 运行类似 shell 中的命令链?我想根据命令的成功情况运行多个命令。我想将其回显到终端(或命令栏)
例如,我有一个键绑定来重新加载配置,如下所示。我还想输出reloaded
以告诉我们发生了什么。但是source-file
当我触发它时,这会显示错误。
bind r source-file ~/.tmux.conf # works fine
bind r source-file ~/.tmux.conf && echo reloaded. # doesn't work shows source-file help in command bar.
bind r source-file ~/.tmux.conf; echo reloaded. # doesn't work, says not recognized 'echo'
这个命令将在哪个 shell 上调用?默认 shell 还是当前 shell 还是在选项卡/窗口/窗格中运行的前台程序?我的默认 shell 是fish
。
答案1
后面指定的bind r
应该是一个或多个tmux 命令(带或不带参数)。source-file ~/.tmux.conf
是有效的 tmux 命令。source-file ~/.tmux.conf && echo reloaded.
不是。要运行多个 tmux 命令,您需要使用;
(有时以 的形式\;
,请参阅将 tmux 键绑定到多个命令了解详情)。但echo
它不是 tmux 命令。
然而run-shell
tmux 命令允许你运行随意的shell 中的代码。我的测试告诉我 shell 是sh
(即使我的命令解释器不是sh
)。手册确认:
shell 命令参数是
sh(1)
命令。
source-file
要从 shell运行,您需要调用tmux source-file …
。这行.tmux.conf
应该可以工作:
bind-key r run-shell 'tmux source-file ~/.tmux.conf && echo reloaded'
shell 的输出(echo
本例中为 from)将以查看模式显示。我个人希望简短的消息显示在状态行中,因此我宁愿使用以下变体:
bind-key r run-shell 'tmux source-file ~/.tmux.conf && tmux display-message reloaded'
分析触发此绑定时发生的情况非常有教育意义。您处于与 tmux 服务器通信的 tmux 客户端中。当客户端收到正确的键序列时,prefixr它会通知服务器,服务器会根据绑定执行操作:运行 shell。shell 运行另一个与同一 tmux 服务器通信的 tmux 客户端并使其执行命令source-file …
。然后 shell 运行另一个与服务器通信的 tmux 客户端并告诉它运行display-message …
。
换句话说,服务器运行一些代码来生成客户端,然后客户端告诉同一台服务器做某事。
你原来的工作绑定(bind r source-file ~/.tmux.conf
)简单很多,服务器source-file …
直接运行。
由于source-file
和display-message
是 tmux 命令,您可以通过按键来运行它们,而无需生成 shell:
bind-key r source-file ~/.tmux.conf \; display-message reloaded
你可能会认为\;
这里的工作方式像;
在 shell 中一样,但实际上它更像&&
。手册状态:
每个命令以换行符或分号 (
;
) 结束。以分号分隔的命令一起构成命令序列- 如果序列中的命令遇到错误,则不会执行后续命令。
因此,最后一个绑定似乎适合您的情况,它不会生成任何不必要的 shell。不过,很高兴知道您可以通过 运行任何程序run-shell
,甚至是额外的 tmux 客户端。
您可以混合使用这两种方法:
bind-key r source-file ~/.tmux.conf \; run-shell '#some complex logic here or whatever'
还有if-shell
。 例子:
bind-key r if-shell 'tmux source-file ~/.tmux.conf' 'display-message reloaded' 'display-message "reload failed"'