私はしばらく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_FLAG
2kill ...
回実行すると実際にキャンセルされます。