Tmux:如何创建“会话>窗口>窗格”并在窗格中运行命令?

Tmux:如何创建“会话>窗口>窗格”并在窗格中运行命令?

我想从 bash 脚本执行下一步:

  • 创建一个名为“my_session”的会话。
  • 在该会话内创建一个名为“my_window”的窗口。
  • 在该窗口内创建两个名为“my_pan1”和“my_pan2”的平移。
  • 在“my_pan1”内发送命令。
  • 在“my_pan2”内发送命令。

你会如何处理这个问题?

答案1

这个 tmux.sh 脚本在我的 tmux 3.0a 上运行,并set -g pane-border-format "#{@mytitle}"在我的 .tmux.conf 中添加了以下内容(请在 scipt 下面的注释中查看原因)。您可能还必须set -g pane-border-status bottom在 .tmux.conf 中添加以下内容:使用以下命令将会话命名为“ses”,窗口命名为“win”,窗格 0“p1”和窗格 1“p2”:

tmux.sh ses 赢 p1 p2

#!/bin/bash
    
session=$1
window=$2
pan1=$3
pan2=$4
    
#Get width and lenght size of terminal, this is needed if one wants to resize a detached session/window/pane
#with resize-pane command here
set -- $(stty size) #$1=rows, $2=columns

#start a new session in dettached mode with resizable panes
tmux new-session -s $session -n $window -d -x "$2" -y "$(($1 - 1))"
tmux send-keys -t $session 'echo "first command in 1st pane"' C-m
    
#rename pane 0 with value of $pan1
tmux set -p @mytitle "$pan1"

#split window vertically
tmux split-window -h
tmux send-keys -t $session 'echo "first command in 2nd pane"' C-m
tmux set -p @mytitle "$pan2"

#At the end, attach to the customized session
tmux attach -t $session

我在重命名窗格时遇到了很多麻烦,因为tmux select-pane -t $window.0 -T $pan1应该可以工作,但如下所述:https://stackoverflow.com/questions/60106672/prevent-tmuxs-pane-title-from-being-updated窗格标题的一些更新可以由 tmux 内的应用程序完成。所以我使用了上一个链接中答案中给出的技巧(Nicholas Marriott 还给出了 3.0a 之前的 tmux 版本的解决方案)

答案2

更短的方法来做到这一点。此示例在网格中生成 4 个窗格。

#!/bin/bash
sh="/usr/bin/env sh" # You can also choose zsh.
SESSION="misc"       # Session name.
WINDOW="experiments" # Window name.

tmux kill-session -t "$SESSION" 2>&1
tmux start \; new-session  -d -s "$SESSION" -n "$WINDOW" "$sh -c \"echo 'first shell'\"; $sh -i" \;
tmux split-window "$sh -c \"echo 'second shell'\"; $sh -i" \;
tmux split-window "$sh -c \"echo 'third shell'\"; $sh -i" \;
tmux split-window "$sh -c \"echo 'fourth shell'\"; $sh -i" \;
tmux select-layout tiled \;
tmux attach -t "$SESSION" \;
tmux switch -t "$SESSION"

相关内容