如何使用 tmux 拆分新窗口并在此新窗口中运行命令?

atu*_*pal 31 tmux

我试过了

tmux -c "shell command" split-window
Run Code Online (Sandbox Code Playgroud)

但它似乎不起作用。

使用tmux split-window,可以拆分一个新窗口。

更新

使用tmux split-window 'exec ping g.cn'可以运行 ping 命令,但停止时新窗口将关闭。

Mic*_*mer 42

用:

tmux split-window "shell command"
Run Code Online (Sandbox Code Playgroud)

split-window命令具有以下语法:

 split-window [-dhvP] [-c start-directory] [-l size | -p percentage] [-t
         target-pane] [shell-command] [-F format]
Run Code Online (Sandbox Code Playgroud)

(来自man tmux,“Windows 和窗格”部分)。请注意,顺序很重要 - 命令必须出现前面出现的任何选项之后,并且它必须是单个参数,因此如果它有空格,则需要将其引用。


对于像ping -c这样快速终止的命令,您可以先设置remain-on-exit选项:

tmux set-option remain-on-exit on
tmux split-window 'ping -c 3 127.0.0.1'
Run Code Online (Sandbox Code Playgroud)

该窗格在ping完成后将保持打开状态,但在您手动关闭它之前会被标记为“死”。

如果您不想更改整体选项,还有另一种方法。该命令使用 运行sh -c,您可以利用它使窗口在最后保持活动状态:

tmux split-window 'ping -c 3 127.0.0.1 ; read'
Run Code Online (Sandbox Code Playgroud)

在这里,您使用 shellread命令在主命令完成后等待用户输入的换行符。在这种情况下,命令输出将一直保留,直到您Enter在窗格中按下,然后它会自动关闭。

  • 我喜欢用`; cat` 相反,所以我必须明确地点击 `<ctrl-c>` 来终止窗口。我经常按“<enter>”来中断输出,因此“read”是不够的。 (3认同)

Cir*_*郝海东 5

bash --rcfile

此技术打开一个新的 shell,运行命令,并在命令完成后将您留在那里:

tmux-split-cmd() ( tmux split-window -dh -t $TMUX_PANE "bash --rcfile <(echo '. ~/.bashrc;$*')" )
tmux-split-cmd 'cd; pwd; ping google.com'
Run Code Online (Sandbox Code Playgroud)

或者,如果该命令没有特殊的终端字符,例如;

tmux-split-cmd ping google.com
Run Code Online (Sandbox Code Playgroud)

这使用:

另一个有趣的变体是:

tmux-split-cmd-uniq() (
  if [ "$(tmux list-panes | wc -l | cut -d' ' -f1)" -ne 1 ]; then
    tmux kill-pane -t 1
  fi
  tms "$@"
)
Run Code Online (Sandbox Code Playgroud)

如果前一个分裂已经存在,它会杀死前一个分裂,并有助于始终只保留一个额外的分裂。