tmuxをexecに置き換える

tmuxをexecに置き換える

私はしばらくtmuxを使ってきて、とても満足しています。ほとんどの場合、必要なのでデフォルトのシェルに設定しました(正確にはguake)。

それは良く、私はそれに非常に満足しています。

しかし、時にはtmuxを終了し、きれいなシェルを持つ必要がありますが、デフォルトではtmuxを使用しているので、セッションを終了すると後で別のtmuxが表示されます。

だから私の質問は:交換可能ですか?多重化プロセス与えられたシェルを使用しますか?

execもちろん、同様のことは、tmux自体ではなくtmux内のシェルを置き換えるため、機能しません。

答え1

私はtmuxがこれを行うことができるとは思わない。 Cプログラミングを知っていれば、はんだ付けするのは簡単です。

あなたができることの1つは、ラッパーシェルスクリプトでtmuxを呼び出し、スクリプトが終了するかどうかを決定することです。 tmuxが終了したときに対話型シェルを実行するようにシグナルをラッパーに送信します。ラッパースクリプトのテストされていない概念証明は次のとおりです。

export TMUX_PARENT_PID=$$
trap 'exec bash -i' USR1
tmux

存在する~/.tmux.conf

update-environment DISPLAY WINDOWID SSH_ASKPASS SSH_AUTH_SOCK SSH_AGENT_PID SSH_CONNECTION TMUX_PARENT_PID

tmux 内で分離後にシェルプロンプトを取得します。

TMUX_PARENT_PID=$(tmux show-environment | sed -n 's/^TMUX_PARENT_PID=//p')
kill -USR1 $TMUX_PARENT_PID
tmux detach-client

答え2

tmux が実行されている場合、環境変数 TMUX が設定されるため、 bashrc にこのような行を置くと、tmux はまだシェルです。

しかし、すでに実行している場合は、bashまたは他のシェルはうまく動作します(chshを使用してシェルをtmuxに設定しないでください。問題になる可能性があります)。

if [[ ! -z ${TMUX} ]]; then
    // run tmux
    tmux "$@"
    exit 0
fi
// tmux is already running

答え3

私は数年遅れていることを知っていますが、@Gillesの答えを読んだ後、信号メカニズムを追加するためにファイルを再設計するのに1〜2時間費やしました。.profileこれは元の質問にもっと答えることができると信じています。タイトル):

# Start tmux:
if [ -n "$(type tmux 2> /dev/null)" ] && [ -z "$TMUX" ]; then
    # Configure a signal handler to allow the tmux session to toggle the exit flag:
    export EXIT_FLAG=1
    export TMUX_PARENT_PID=$$
    trap 'EXIT_FLAG=$(($EXIT_FLAG ^ 1))' USR1

    # Start tmux:
    tmux new-session -s "shell$$" "TMUX_PARENT_PID=$$ $SHELL -l"

    # Exit, assuming the exit flag has not been flipped:
    if [ "x$EXIT_FLAG" == "x1" ]; then
        exit
    fi

    # Otherwise, cleanup the environment:
    unset EXIT_FLAG
    unset TMUX_PARENT_PID
    unset TMUX
fi

myでこのコマンドを使用すると、.profileすべてのシェルはデフォルトでtmuxを起動し、tmuxで終了します。シェルが tmux 終了後も保持されるようにするには、kill -s USR1 $TMUX_PARENT_ID実行前に実行してもexitシェルは終了しません。

kill ...上記のコマンドは実際に変数を切り替えるため、連続してEXIT_FLAG2kill ...回実行すると実際にキャンセルされます。

関連情報