存在しない場合に新しいtmuxセッションを作成する方法


144

tmux session名前付きtmuxセッションが存在する場合にアタッチする方法を見つけようとしています。存在しない場合は、指定された名前で新しいセッションを作成します。

現在、私tmuxが探しているものを部分的に実現できるいくつかのコマンドを知っていますが、それらを組み合わせて探しているものを取得する方法は明確ではありません。

  • tmux attach 自動的に存在するセッションに接続します-セッションが存在しない場合はエラーになります
  • tmux new 新しいセッションを作成しますが、毎回作成するので、自分の中に残すことはできません。 .tmux.conf
  • tmux has-session セッションが存在するかどうかをテストします-しかし、他のコマンドと一緒にそれをつなぎ合わせる方法がわかりません

したがって、セッションにログインする必要があるたびに手動で作成する代わりに、自動的に実行されるように、tmuxスクリプトを作成したいと思います。

新しいtmuxセッションを作成する(指定されたセッション名が存在しない場合)、またはセッション名にアタッチする(存在する場合)ように自動スクリプトを作成するにはどうすればよいですか?


15
@kzh:私はvimのように、プログラミングツールの質問として、それを見る
ホタルブクロ

6
誰かの興味がある場合に備えて、この質問に対する別の可能な回答を要点として書きました:gist.github.com/chakrit/5004006
chakrit

9
一方、私のman tmux言う:「-Aフラグは、セッション名が既に存在する場合、新しいセッションをattach-sessionのように動作させます」
Petr Viktorin

1
これを移動するようにフラグを立てる場合、モデレーターでさえ60日以上経過した質問を別のサイトに移行できないことに注意してください。このシステム制限の理由は、ここで説明されています
ブラッド・ラーソン

1
:@BradLarsonは、現在、これを行うための最良/最も簡単なオプションは、道の下、コメントに答えているstackoverflow.com/questions/3432536/...。ここに来るほとんどのユーザーはこれを見つけることができません。投票数でわかるように、これは明らかに非常に重要な質問です。この質問を開いて、それを回答として追加して、新しい人が見つけられるようにすることは可能ですか?
alpha_989 2018年

回答:


89

または、次を追加できます

new-session

あなたに.tmux.conf-それはサーバーの起動時にデフォルトのセッションを作成します。

次にtmux attach、現在のセッション(実行中のサーバー、つまり)に接続するか、新しいセッションを作成(サーバーを起動し、構成ファイルを読み取り、new-sessionコマンドを発行)して接続します。


3
これが新しいセッションを作成するとき、デフォルトのパスはtmuxが呼び出されたパスではなく、私のホームディレクトリです。
Richard Hansen

2
@AB:どういう意味ですか?
ユルゲン・A.エアハード

これで@RichardHansenの問題を解決する方法はありますか?現在のパスからの呼び出しは最も理にかなっnew-sessionているようであり、それを破棄する場合、それは本当の問題のようです。
Lee Olayvar 2013

2
これは、使用する場合のtmux設定の再読み込みを中断します(source-file ~/.tmux.conf
Sebastian Blask

11
@SebastianBlask セッションに名前を付ける場合、-Aオプションを使用できnew-sessionます。new-session -A -s mysession設定の再読み込みでうまく機能します。
jkoelker 2016年

163

私はそれを理解しました(そしてそれを私に指摘してもらいました)。

tmux attach || tmux new

28
セッションに名前を付けることができるので、この回答の方がうまくいきますtmux attach-session -t my-session || tmux new-session -s my-session。唯一の問題は、これがアトミックではないことです。tmuxには、create-or-attachコマンドが必要です。
アンドリュー

5
私はbashに次のエイリアスがありますalias tm='tmux attach || tmux new'
azat 2013

10
賛成票を投じるのは、小さな微調整でこれが名前付きセッションで機能するためですtmux attach -t some_name || tmux new -s some_name。some_nameを$ 1に変更してシバンを追加し、保存します。
Cheezmeister 2014年

10
tmuxのに慣れていないと疑問を抱いたものに注意newVS new-session:彼らは同義語であり、そうしているattachattach-session
Esteis 2015

1
tmux new-session -ds default \; split-window -dv 2>/dev/null; tmux attach -t defaultはるかにうまく機能し/bin/kill、最初のtmuxを開いても、最初のtmuxは開きません。唯一の欠点は、このためにセッションに名前を付ける必要があることです。
ティーノ2016年

64

Petr Viktorinjkoelker、およびpjinczからのコメントで指摘されているように、次のコマンドを使用して、mySession存在する場合はアタッチし、存在しない場合は作成できます。

 tmux new -A -s mySession

からman tmux

new-session[-AdDEP] [-cstart-directory] [-Fformat] [-nwindow-name] [-ssession-name] [-tgroup-name] [-xwidth] [-yheight] [shell-command]

(別名:new

という名前の新しいセッションを作成しますsession-name

[...]

-Aフラグが作るnew-sessionように振る舞うattach-session場合はsession-nameすでに存在しています。この場合、-Dは次のよう-dに動作しattach-sessionます。

new-session-Atmux-1.8からサポートされています。


1
これをgnome-terminalコマンドなどで使用する場合は-s、特定のセッション名を省略gnome-terminalして、同じセッションに新しいセッションがアタッチされないようにすることをお勧めします。prefix + s新しいターミナルを開いた後は、いつでも既存のセッションを選択できます。
dragon788

14

1つのセッションを使用するには、ラピオンの答えで十分だと思いますが、このスクリプトを使用すると、複数のセッションをセットアップできます。

SESSIONS="work play"

function has-session {
    tmux has-session -t $1 2>/dev/null
}

function except 
{
    if [ "$?" -eq 1 ] ; then
        $1
    fi
}

# Configure your sessions here
function session-work
{
    tmux new-session -d -s work
    tmux neww -k -t work:1
}

function session-play
{
    tmux new-session -d -s play
    tmux neww -k -t play:1
}

#
#MAIN 
for x in $SESSIONS
do
    echo $x
    has-session $x
    except session-$x
done

注意:

-k  --> new-window will not be created if already exists
-d  --> start session or window, but don't attach to it yet
-s  --> name the session
-t  --> specify a target location in the form session:window.pane 

13

起動時にプロジェクトベースの構成を含めるようにAlexの提案を適用して、私は次のものを使い始めました:

# ~/bin/tmux-myproject shell script
# The Project name is also used as a session name (usually shorter)
PROJECT_NAME="myproject"
PROJECT_DIR="~/myproject"

tmux has-session -t $PROJECT_NAME 2>/dev/null
if [ "$?" -eq 1 ] ; then
    echo "No Session found.  Creating and configuring."
    pushd $PROJECT_DIR
    tmux new-session -d -s $PROJECT_NAME
    tmux source-file ~/bin/tmux-${PROJECT_NAME}.conf
    popd
else
    echo "Session found.  Connecting."
fi
tmux attach-session -t $PROJECT_NAME

どこtmux-myproject.confに、私のウィンドウとペインを作成し、エディターを起動するための一連のtmuxコマンドがあります。


8

必要に応じてエイリアスを使用して新しいセッションを作成し、すでに存在する場合はデフォルトセッションにアタッチします。

alias tmuxre='tmux new-session -t default || tmux new-session -s default'

これをサーバーの.loginに追加しました。

この方法で行う理由は、同じ実際のセッションにアタッチしたくないため、同じウィンドウグループを使用する新しいセッションが必要だからです。

これはを実行することにも似ていscreen -xRRます。


2
セッションに頻繁に出入りしている場合は、これにより、未使用のセッションがたくさん残りますtmux list-sessions
Anm

ええ、そうです、時々それらを片付けます。私が欲しい機能を手に入れるのは小さな欠点です。
マイケル

@ mateusz-piotrowski様-私はコードをコードブロックでラップする編集に同意しますが、他のテキストを編集して、私が言ったものと異なるようにするのはなぜですか?ここでコメントして申し訳ありませんが、私はどこにも見ませんでした。
Michael

あなたを怒らせるつもりはなかった。設定ファイルでエイリアス実行できないと思ったので、タイプミスであったに違いありません。
Mateusz Piotrowski

3
これで、次のように入力できtmux new -A -s defaultます。新しいセッションが存在しない場合、または自動的に接続する場合は、新しいセッションを起動します。設定ファイルを編集するよりずっと良いと思います。
pjincz 2017

1

で同じことをしたい人のためにfish

tmux attach -t mysesh; or tmux new -s mysesh
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.