デフォルトのシェルを設定してtmuxを起動するにはどうすればよいですか


回答:


46

これはうまくいくようです...

https://wiki.archlinux.org/index.php/Tmux#Start_tmux_on_every_shell_login

次のbashコード行を、エイリアスの前の.bashrcに追加するだけです。他のシェルのコードは非常に似ています:

[[ $TERM != "screen" ]] && exec tmux

2
私にとっては、これ[[ $- != *i* ]] && returnは無限ループではないことも必要でした(同じページから)
キーススマイリー

5
TERMユーザーの.tmux.confファイルによって他の値に設定される可能性があるため、これは悪い解決策です。TMUX変数が設定されているかどうかを確認する方が良いです。
クサラナンダ

104

@StarNamerの答えは一般的に正確ですが、通常、(1)システムにtmuxが存在すること、(2)対話型シェルを使用していること、(3)tmuxが内部で実行されないことを確認する次のテストを含めます自体:

if command -v tmux &> /dev/null && [ -n "$PS1" ] && [[ ! "$TERM" =~ screen ]] && [[ ! "$TERM" =~ tmux ]] && [ -z "$TMUX" ]; then
  exec tmux
fi

参照資料


1
ニース、私はcommand以前必要でしたが、それが存在することに気づきませんでした。
Freedom_Ben

2
このexecステートメントでは、端末全体を終了せずにtmuxを終了できません!:|
ルイマドックス

5
@LouisMaddox:exec現在のプロセスを新しいプロセスに置き換えます-この場合、bashログインシェルをtmuxに置き換えます。したがって、tmuxが終了すると、フォールバックする他の端末はありません:)
Mark K Cowan

1
@rjtそのとおりです。これにより、設計により新しいセッションが開始されます。既存のtmuxセッションに接続する場合は、好みのexec tmuxフレーバーに置き換えてくださいtmux attach
user7089

2
代わりexec tmuxに使用するexec tmux new-session -A -s mainので、常にメインと呼ばれるセッションを持ち、それに接続します(リモートマシンに接続するたびに新しいセッションを作成する代わりに)が、tmux attach使用可能なセッションがない場合のようにクラッシュしません(ここにあります:unix.stackexchange.com/a/176885/256942
ヴェレーナHaunschmid

16

のような行を追加する

[ -z "$TMUX"  ] && { tmux attach || exec tmux new-session && exit;}

あなたのbashrcファイルでおそらく仕事をするでしょう。この行は、tmuxをデタッチまたは終了すると、sshを終了して接続を終了することに注意してください。キーストロークを保存して接続を終了するため、この構成が気に入っています。ただし、これが気に入らない場合(これは非常にありそうもないと思います)、終了後にログインシェルに残る場合は、そのexit部分を削除するだけです。

[ -z "$TMUX"  ] && { tmux attach || exec tmux new-session;}

また、でラップtmux attachしないでください。execこれにより、接続するtmuxセッションがないときに接続が閉じられます。


この行を.bashrcに追加しましたが、ターミナルを起動すると、次のメッセージが表示されます:/home/z/.tmux.conf:10:no current session(メッセージは11、13、14行目で繰り返されます、15)。これらの行は、「set default-command "exec bash"」や「set default-terminal "screen-256color"」のようなものです
Matt G

@MattG tmux構成ファイルに何か問題があるように感じます。
huangzonghao

5

chshログインシェルを変更するコマンドがあります。相談してくださいman chsh


6
tmuxはシェルではなく、GNUスクリーンのようなターミナルマルチプレクサです。おもしろいこと-cに、manページによるオプションをサポートしているので、ログインシェルとして使用するのに十分なシェルのように機能するかもしれませんが、すべての状況、たとえばgdm / kdmを介したグラフィカルログインでは適切に機能しないと思われます。
ミケル

1
これは理にかなっており、ドキュメントに裏付けられていますが、SSH(のようなものssh $some_server echo foo)を介した直接コマンド実行を中断するようです。
n.st

3
Ubuntuの1.8以降のtmuxはに自身を追加する/etc/shellsため、有効なログインシェルです。
クレイトロン

2
これにはdefault-shell、実際のシェルを指すようにtmux構成で設定を構成する必要があります。
クサラナナンダ

4

私は正常に使用しています

case $- in *i*)
    [ -z "$TMUX" ] && exec tmux
esac

私の.zshrc。bashを使用している場合は、.bashrc代わりにそれを置きます。


またtmux、デフォルトのシェル(chsh -s $(which tmux))として設定しようとしましたが、SSHを介した直接のコマンド実行が中断されるようssh $some_server echo fooです。たとえば、出力は生成されません。


3

端末の優先順位に移動します。 ここに画像の説明を入力してください

そして、「コマンド」バーをクリックします。 ここに画像の説明を入力してください

「私の販売の代わりにカスタムコマンドを実行する」をチェックし、ターミナルの起動時に実行するコマンドを記述します。


1

上記の応答はどれもうまくexec tmuxいきませんでした- シェルを終了せずにtmuxを閉じることができません(Ctrl+で開くかT、アプリケーションメニューから開くか)。

Linux Mintを使用します。これにより、特定のホットキーをコマンドにマップできます。また、コマンドを起動するbashシェルがあります。たとえば、Win+ Alt+ Bは何らかの複雑なbash -exec(vim)ステートメントを.bashrcを編集して、通常のシェルのように機能するようにします。

上記の状況をmy .bashrc。tmux実行行を別のifステートメントでラップし、対話モードで実行されていることを確認しました。

if command -v tmux>/dev/null; then
        if [ ! -z "$PS1" ]; then # unless shell not loaded interactively, run tmux
                [[ ! $TERM =~ screen ]] && [ -z $TMUX ] && tmux
        fi
fi

すべてを1行にまとめることができますが、読みやすくするためにそれで問題ないと思います。


アンパサンドを追加すると、そのような問題は解決します。[[ ! $TERM =~ screen ]] && [ -z $TMUX ] && exec tmux &
ダニエルシャトー

1

@Louis Maddoxの答えに加えて、tmux部分を実行します。

(exec tmux attach || exec tmux new-session)

私が使用してexec sh -c 'tmux a || tmux'のおかげで、私は:)上で、今からあなたを使用します.....(あなたの答えを見た後)は、おそらくtmuxのは、何らかの理由で起動できない場合、悪いことが起こるようになりますこれは、
マーク・K・コーワン

1
tmux new -A -s mysessionおそらく動作します。
poolie

1

これは私の~/.profile(私が使用しているksh93)です:

if [[ -z "$TMUX" ]]; then
    if tmux has-session 2>/dev/null; then
        exec tmux attach
    else
        exec tmux
    fi
fi

TMUX環境変数が設定されていない/空の場合、まだtmuxセッションではないため、...

tmux has-session終了ステータスがゼロ(true)で戻った場合、接続可能なセッションがあります。それに取り付けます。

そうでない場合は、新しいセッションを作成します。

tmuxログインシェルとして使用することもできます。ただし、これを行う場合default-shellは、~/.tmux.confファイル内の実際のシェルに設定してください(これについての詳細は、tmuxのマニュアルを参照してください)。


1

chshcommandを使用してtmuxをデフォルトのシェルとして設定し、次に以下を追加することができます(そしておそらく今のところそうなっているはずです).tmux.conf

set-option -g default-shell /path/to/your/favourite/shell

行の最後でパスを変更することを忘れないでください。


1

広範なセッションチェックと条件付きセッションチェックを組み合わせて、独自のスピンを実行して、接続された、または作成されたデフォルトセッションを作成しました。別のtmuxセッション内にいる場合、または他の保護条件が満たされている場合を除きます。

if command -v tmux &> /dev/null && [ -n "$PS1" ] && [[ ! "$TERM" =~ screen ]] && [[ ! "$TERM" =~ tmux ]] && [ -z "$TMUX" ]; then
  tmux a -t default || exec tmux new -s default && exit;
fi

これらの回答に基づいて:

https://unix.stackexchange.com/a/306165/198110

https://unix.stackexchange.com/a/113768/198110



-3

Mikelがすでにコメントで述べているように、ログインシェルには副作用がある可能性があるため、tmuxが必要です。しかしtmux、文字通りデフォルトのシェルを作成できます。ユーザーのデフォルトシェルは/ etc / passwdで定義されています。したがって、rootになって/ etc / passwdを編集できます。たとえばsudo vi /etc/passwd、ユーザー名で始まる行を検索します。おそらくで終わり:/bin/bashます。/ bin / bashを/ usr / bin / tmuxに変更すると、tmuxがデフォルトのログインシェルになります。

ただし、これが問題を引き起こさないという保証はありません!

うまくいくかもしれないのは、ルート権限を必要とするものは何もしないことです。私は.bash_loginという名前のホームディレクトリにファイルを作成し、そのファイル内からtmuxを起動しようとします: `echo" tmux ">〜/ .bash_login。

これは動作するはずですが、bashのbashドキュメントでは、どのファイルがいつ読み取られて実行されるかについて、あまり正確ではありません。


2
最初の段落で説明するのは何をするchshことです!あなたの方法はルートである必要があり、エラーが発生しやすいことを除きます。tmuxから実行すると、リモートログインが中断される可能性.bash_login高くなります。
ジル
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.