次のように単純な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つ
答え1
必要なものを達成するための迅速で簡単なコマンドラインは次のとおりです。
$ tmux new-session -s asdf -n myWindow -d 'tail -f foo'\; \
split-window -d 'tail -f bar'\; attach-session
このソリューションにはいくつかの欠点があります。
スケーラビリティが悪い(コマンドがさらに追加され、結果を理解するのが難しい)。
2つのtailコマンドはインタラクティブシェルでは実行されないため、2つのコマンドを終了するとウィンドウが
myWindow
破棄されます(セッションが作成されない場合はウィンドウがセッションとともに破棄されます)。
以下は、試した方法で動作するシェルスクリプトです。私の目標を達成する方法について考えることは常に最も簡単です。手動その後、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シンプルでより透明な構文を使用してtmuxセッションを管理できるRuby gemです。
私の答えに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
プロジェクトに好みの作業環境を作るために駆けつけます。