tmux 使用键绑定运行管道/命令链

tmux 使用键绑定运行管道/命令链

如何使用 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-shelltmux 命令允许你运行随意的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-filedisplay-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"'

相关内容