我想创建一个简单的 tmux conf 来执行以下操作。
- 水平分割窗口/窗格/whatever_stupid_terminology (hsplit)
- 在顶部窗格中打开
tail -f foo
- 在底部窗格中打开
tail -f bar
我怎样才能用 tmux 做到这一点?
这就是我所拥有的,
#!/bin/sh
tmux new-session -s asdf -n myWindow
tmux select-window -t myWindow
tmux split-window "tail -f /var/log/apache2/samperror.log"
tmux attach-session -t asdf
我想不出任何可行的办法。所以我知道这一切都是错的。有史以来最不直观的conf文件之一
答案1
这是一个快速而肮脏的命令行,可以实现您想要的:
$ tmux new-session -s asdf -n myWindow -d 'tail -f foo'\; \
split-window -d 'tail -f bar'\; attach-session
该解决方案有一些缺点:
它的扩展性不太好(多一些命令,结果难以理解)。
这两个 tail 命令不在交互式 shell 中运行,因此如果您退出这两个命令,窗口
myWindow
将被销毁(如果您没有创建更多会话,则窗口将与会话一起被销毁)。
这是一个按照您尝试过的方式工作的 shell 脚本。对我来说,思考如何实现我的目标总是最容易的手动然后将其转换为 tmux 命令。这可能不是最简单或最干净的方法,但通常有效:
#!/bin/sh
# create a new session. Note the -d flag, we do not want to attach just yet!
tmux new-session -s asdf -n 'myWindow' -d
# send 'tail -f foo<enter>' to the first pane.
# I address the first pane using the -t flag. This is not necessary,
# I'm doing it so explicitly to show you how to do it.
# for the <enter> key, we can use either C-m (linefeed) or C-j (newline)
tmux send-keys -t asdf:myWindow.0 'tail -f foo' C-j
# split the window *vertically*
tmux split-window -v
# we now have two panes in myWindow: pane 0 is above pane 1
# again, specifying pane 1 with '-t 1' is optional
tmux send-keys -t 1 'tail -f bar' C-j
# uncomment the following command if you want to attach
# explicitly to the window we just created
#tmux select-window -t asdf:mywindow
# finally attach to the session
tmux attach -t asdf
如果经过一番尝试后您仍然不喜欢tmux
命令和配置语法,您可能需要研究一下tmuxator,一个 Ruby gem,可让您使用简化且更透明的语法来管理 tmux 会话。
在我的回答中无需 X 服务器即可同时使用多个终端tmux
您可以找到一些有用资源的链接
答案2
假设您确实想从您的~/.tmux.conf
而不是外部脚本运行它,您可以将其附加到您的配置文件中:
# session initialisation
new -s SessionName -n WindowName 'tail -f /var/log/apache2/samperror.log'
splitw -h -p 50 -t 0 'tail -f /var/log/apache2/other.log'
selectw -t 0
然后,当您使用附加到会话的命令启动 tmux 时tmux a
,它将创建 SessionName,并将窗口水平 ( -h
) 分成两半 ( -p 50
) 并运行这两个命令。
答案3
基于回答这是更通用的代码:
tmuxMany(){
#https://unix.stackexchange.com/a/149729/47116
if [ $# -lt 2 ]; then
echo usage: sessionName command1 command2 ...
return 1
fi
local sessionName=$1
local firstCommand=$2
local secondAndRestCommands=( "${@:3}" )
tmux new-session -s $sessionName -n 'myWindow' -d
tmux send-keys -t $sessionName:myWindow.0 "$firstCommand" C-j
local i
for i in "${!secondAndRestCommands[@]}"
do
echo $i
local command=${secondAndRestCommands[$i]}
echo $command
tmux split-window -v
local tabNumber=$((i+1))
tmux send-keys -t $tabNumber "$command" C-j
done
tmux select-layout even-vertical
tmux attach -t $sessionName
}
用法:
tmuxMany sessionName "tail -f file" "tail -f file2" htop
将打开 tmux,其中有 3 个高度相等的窗格。
答案4
尝试这样的事情:
$ chmod +x tmux.conf
$ cat tmux.conf
#!/usr/bin/tmux source-file
new-session -s asdf -n myWindow "tail -f /var/log/maillog"
split-window "tail -f /var/log/messages"
当您运行时./tmux.conf
,tmux 会依次执行每个命令,创建您请求的布局。
令人惊讶的是,仅在创建的第一个会话tmux -f tmux.conf
中运行命令。tmux.conf
如果您已经有会话正在运行,-f tmux.conf
则会默默地忽略该会话。您可以使用 来解决这个问题tmux source-file tmux.conf
。您可以在 shebang 行中使用它,使其成为脚本。
我发现这项技术非常有用。在每个项目目录的根目录中,我都有一个可执行文件tmux.conf
。当我再次开始处理该项目时,我会跑去./tmux.conf
创建我喜欢的该项目的工作环境。