我想要一个 shell 脚本,该脚本将tmux
使用N
大小相等、垂直分割的窗格启动,每个窗格都有自己的起始目录,其中N
由指定的起始目录数决定。例如,
tmux-launch SESSION-NAME DIR1 DIR2 DIR3 ...
能够提供与每个起始目录相对应的初始命令将非常有用。例如,
tmux-launch SESSION-NAME DIR1:"CMD1" DIR2:"CMD2" DIR3:"CMD3" ...
答案1
这是我为此编写的脚本。保存为tmux-launch.sh
( chmod +x tmux-launch.sh
):
#!/bin/bash
if [[ -z $2 ]]; then
current=$(tmux display -p "#S")
cat<<EOF
USAGE: $(basename $0) SESSION DIR [DIR] ...
[DIR] one or more startup directories; at least one is required
EOF
if [[ -n $current ]]; then
echo "current session: $current"
fi
exit 1
else
session="$1"
shift
fi
# start tmux
tmux new-session -s $session -d
args=( "$@" )
i=1
for e; do
# capture directory and optional command from $e
d=$(echo $e | cut -d: -f1)
c=$(echo $e | cut -d: -f2)
if [ ! -d $d ]; then
echo WARNING: directory does not exist, $d >&2
continue
fi
# Select pane $i, set dir to $d, run pwd
if [ $i -gt 1 ]; then
tmux split-window
fi
tmux select-pane -t $i
tmux send-keys "cd $d" C-m
if [ -n "$c" ]; then
# execute optional command
tmux send-keys "$c" C-m
fi
# equally-spaces
tmux select-layout even-vertical
i=$(expr $i + 1)
done
# Finished setup, attach to the tmux session!
tmux attach-session -t $session
例如,以下用法将启动一个tmux
名为“work”的会话,其中有五个窗格,每个窗格都从一个唯一的目录开始,并执行pwd
每个窗格中的命令和echo tada
第一个窗格中的命令(当然,此示例假设目录~/scratch*
存在):
tmux-launch.sh work ~/scratch1:"pwd;echo tada" \
missing-directory:"echo do nothing" \
~/scratch2:pwd ~/scratch3:pwd ~/scratch4:pwd ~/scratch5:pwd
该工具将跳过任何不存在的目录,并向stderr
.
我已使用tmux
版本2.7
、3.1c
和在 Red Hat Enterprise Linux 和 SUSE Linux Enterprise Server 发行版上对此进行了测试。3.2a
3.3
编辑 2024 年 3 月 2 日:找到了上述脚本的更复杂版本这里。此扩展脚本提供了一些附加选项,包括水平分割和平铺布局。
编辑2024年3月4日:此脚本假定您的tmux
配置以窗格编号 1 开始,而不是默认的 0。例如,在 my 中~/.tmux.conf
:
# Set the base-index to 1 rather than 0
set -g base-index 1
set-window-option -g pane-base-index 1