背景与问题:
我创建了一个 tmux 脚本来打开几个窗口。它工作得很好,但后来我想在一个窗口上放置一个垂直分割的窗格,并将其大小调整为 5 个字符高。我无法让我的 bash 脚本正确调整窗格大小。根据我尝试的命令,它会增加或减少大小,但从 bash 执行时,它表现得像被绑定到某个范围。
我尝试过的一些命令/变体:
tmux split-window -v -l 5 -t 0
有或没有-t 0
tmux split-window -v -p 5 -t 0
有或没有-t 0
tmux split-window -v
其次是tmux resize-pane -D 23 -t 1
带或不带 -t 参数- 我也尝试了以下变体:
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 行高。我可以从运行列出的所有命令之内tmux 使用 Cb 和 : (我的默认前缀键),它们完全按预期工作。
我的 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
此外,我尝试删除除最初创建的新窗口之外的所有内容,并尝试拆分和调整大小,而不发送其他命令(即添加其他窗口并在 VIM 中打开目录)。
另外,在执行此脚本时,我收到一条终端消息,提示“无法连接到服务器:连接被拒绝”,但我的所有窗口都正常工作并按预期运行(MySQL 和 VIM 完美打开,我的 sudo 命令等待我的密码)。不确定尝试连接到哪个服务器(MySQL 是本地的)并且失败了,但似乎没有影响我寻求的任何功能。
答案1
根据文档,当您创建分离会话 ( new-session -d
) 时,其默认大小为 80×24。如果您使用实际高度为 24 行(或 25 行,因为tmux如果你使用一个作为状态行,那么你会发现下面的 Vim 窗格实际上只有五行。
当您使用比 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
该failed to connect to server: Connection refused
消息来自您的tmux has-session
命令。它报告说没有现有服务器。由于您只对退出代码感兴趣,因此您可能只需将输出发送到/dev/null
以避免看到它。您也可以将命令直接放入语句中if
:
if tmux has-session -t "$SESSION" 2>/dev/null; then
⋮
fi
顺便说一句,您几乎总是应该将参数扩展放在双引号中(以避免分词和全局扩展)。您只有一个参数,并且其值(从 复制USER
)通常不加引号可能是安全的,但在几乎所有情况下始终将扩展放在引号中是一个好习惯。