无法从 bash 脚本调整 tmux 窗格的大小

Eri*_*c H 6 bash tmux bash-scripting

背景和问题:

我创建了一个 tmux 脚本来打开几个窗口。它工作得很好,但后来我想在一个窗口上放置一个垂直拆分的窗格并将其大小调整为 5 个字符高。我无法让我的 bash 脚本正确调整窗格大小。根据我尝试的命令,它会增加或减少大小,但它的行为就像从 bash 执行时绑定到某个范围一样。

我尝试过的一些命令/变体:

  1. tmux split-window -v -l 5 -t 0 有和没有 -t 0
  2. tmux split-window -v -p 5 -t 0 有和没有 -t 0
  3. tmux split-window -v 后跟 tmux resize-pane -D 23 -t 1 有和没有 -t 参数
  4. 我还尝试了以下变体:tmux send-keys C-b '"' C-m其次是tmux send-keys C-b ':resize-pane -D 20'但通常将引号和 resize-pane 命令转储到实际的终端缓冲区中,而不是使用 tmux 执行命令。

任何数量的最佳情况是窗格从屏幕的一半(56 行 / 2 = 28 行)调整到 20 行高(我的终端是 56 行高,因此一半 - 20 = 8)。或者,如果我将 resize-pane 命令设置为 -U 向上,然后设置一些较高的数字,它将使窗格更高,但仍然只会变得如此之大,从而使窗格 0 保持一定的高度。我似乎无法创建一个窗格并将其从 bash 脚本调整为 5 - 10 行高。我可以运行所有列出的命令使用Cb和TMUX:(我的默认前缀键)和他们工作完全符合预期。

我的 tmux bash 脚本:

# the name of your primary tmux session
SESSION=$USER

# if the session is already running, just attach to it.
tmux has-session -t $SESSION
if [ $? -eq 0 ]; then
    echo "Session $SESSION already exists. Attaching..."
    sleep 1
    tmux -2 attach -t $SESSION
    exit 0;
fi

# create a new session, named $SESSION, and detach from it
tmux -2 new-session -d -s $SESSION

# Now populate the session with the windows you use every day

# 0 - VIM
tmux new-window  -t $SESSION:0 -k -n VIM 
tmux send-keys   -t $SESSION:0 'cd /home/aDir/myDir/' C-m 
tmux send-keys   -t $SESSION:0 'vim .' C-m 

tmux split-window -v -l 5 -t 0 <--- HERE IS WHERE I WAS SWAPPING/TRYING COMMANDS

# 1 - MySQL
tmux new-window -t $SESSION:1 -k -n MySQL 'mysql -u root -p******** mydb'

# 2 - Shell
tmux new-window -t $SESSION:2 -k -n Shell 'sudo -s'

tmux select-window -t $SESSION:0
tmux -2 attach -t $SESSION
Run Code Online (Sandbox Code Playgroud)

此外,我尝试删除除初始创建新窗口之外的所有内容,并尝试在不发送其他命令的情况下拆分和调整大小(即添加额外的窗口并在 VIM 中打开一个目录)。

顺便说一句,在执行此脚本时,我收到一条终端消息,说“无法连接到服务器:连接被拒绝”消息,但我所有的窗口都在按预期工作(MySQL 和 VIM 完美打开,我的 sudo 命令等待我的密码)。不确定尝试连接到哪个服务器(MySQL 是本地的)并且失败,但似乎不会影响我寻求的任何功能。

Chr*_*sen 12

根据文档,当您创建分离会话 ( new-session -d) 时,默认大小为 80×24。如果您附加了一个实际上有 24 行高(或 25 行,因为tmux使用 1 行作为状态行)的终端窗口,那么您应该会发现下面的 Vim 窗格实际上最终只有 5 行。

当您使用比 24 行高得多的终端窗口附加到会话时,就会出现问题。执行此操作时,tmux 会调整窗格的大小以填充整个终端窗口。发生这种情况时,下部窗格会超过原来的五行。

解决此问题的一种方法是创建初始大小与最终将附加到会话的终端窗口相匹配的分离会话。执行此操作的一种半便携式方法是解析输出stty size(某些 shell 还提供 LINES 和 COLUMNS 参数(尤其是在交互模式下时),但这些参数在 shell 脚本中并不总是可用和可靠)。

set -- $(stty size) # $1 = rows $2 = columns
tmux -2 new-session -d -s "$SESSION" -x "$2" -y "$(($1 - 1))" # status line uses a row
Run Code Online (Sandbox Code Playgroud)

failed to connect to server: Connection refused消息来自您的tmux has-session命令。它报告说它没有现有的服务器。由于您只对退出代码感兴趣,您可能只需将输出发送到/dev/null以避免看到它。您也可以将命令直接放入if语句中:

if tmux has-session -t "$SESSION" 2>/dev/null; then
    ?
fi
Run Code Online (Sandbox Code Playgroud)

顺便说一句,您几乎应该总是将参数扩展放在双引号中(以避免分词和全局扩展)。您只有一个参数,其值(从 复制USER)(通常)可能是安全的,不要引用,但在几乎所有上下文中始终引用您的扩展是一个好习惯。

  • @EricH:[重定向](http://pubs.opengroup.org/onlinepubs/009695399/utilities/xcu_chap02.html#tag_02_07) 操作符之前的数字告诉它要重定向哪个文件描述符;所以`2&gt;`告诉shell重定向文件描述符2(称为“stderr”,*tmux*发送“连接失败”和“找不到会话”消息的地方)。shell 主要进行字符串处理,因此您需要一种方法来告诉它们进行数学运算;`$((...))` 语法用于 [Arithmetic Expansion](http://pubs.opengroup.org/onlinepubs/009695399/utilities/xcu_chap02.html#tag_02_06_04)(即内联数学)。 (3认同)