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 或在選項卡/視窗/窗格中執行的前台程式?我的預設外殼是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本例中的輸出)將會出現在檢視模式中。就我個人而言,我希望短訊息出現在狀態列中,所以我寧願使用這個變體:

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"'

相關內容