私はデフォルトのLinux仮想コンソール(私が使用するもの)の代わりにtmuxを使用することを好むので、TTYにログインしたときにtmuxが自動的に実行されるようにagetty
これを入れました。~/.bashrc
if [[ "$(tty)" == /dev/tty* ]]; then
tmux -u
fi
一見すると、これはうまくいくようです。ログインするとすぐにtmuxが実行されます。しかし、tmuxを終了すると、tmuxはすぐに2番目に実行されます!完全な動作は次のとおりです。
- ctrl+ alt+f2
- ログイン
- tmuxを実行する前にしばらく表示されるデフォルトのプロンプト
- 私も挟んで
tmux
- ctrl+d
- テキストが
[exited]
短時間点滅してからtmux
戻ります。 - ctrl+d
- なしで基本端末に戻る
tmux
- ctrl+d
- 今私は完全にアウトしました
追跡できません - いろいろなロギングをしてみて、環境変数を設定して、探してみると$SHLVL
実際には.bashrc
ログインするたびに7回は実行されるようです!
私は通常Xでtmuxを使用しませんが(Konsoleのみを使用しています)、tmux以外のすべてのセッションに対してtmuxを実行するようにbashrcを設定しようとしましたが、この二重の動作はいいえKonsoleで発生しました。
私は以下を使用しています:
- Arch Linux(4.8.13-1)
- アジティ
- マルチプレクサ
- バシシュ
- 完全
~/.bashrc
およびその他の構成(~/.bash_profile
ファイルなし):https://gist.github.com/tobek/c8038c207f318528c3157b4a402aa2d9(Bashishエントリを削除しようとしましたが、動作はそのまま残ります)
原因は何ですか?
答え1
修正#1:
追跡できませんでしたが、次のハッキングで問題を解決しました~/.bashrc
。
if [ -z "$user_bashrc_already_run" ]; then
export user_bashrc_already_run=1
else
return
fi
修正#2:
これを正しく追跡してください。 TTYは対話型ログインシェルなので、両方が/etc/profile
実行されます~/.profile
(Xのターミナルエミュレータはログインシェルではないため、どちらもロードしません)。私の場合(なぜBashishのインストールなのかわかりませんが)、ファイルは同じで、すべてのスクリプトのソースになります/etc/profile.d
。私の場合は、1つのソースが含まれています~/.bashrc
。
すべての重複コードを削除して~/.profile
問題を解決しました。
「呼び出し」セクションを読んで、次man bash
の質問を読んでください。https://serverfault.com/questions/261802/what-are-the-function-differences- Between-profile-bash-profile-and-bashrcとても便利です。
同様の問題を抱えている人がいる場合は、tmuxをサブシェルとして実行するのではなく、シェルをtmuxに置き換えるので、tmuxを実行するより良い方法があります。
if command -v tmux>/dev/null; then # check if tmux command exists
if [[ "$(tty)" =~ /dev/tty ]] && [[ ! "$TERM" =~ screen ]] && [ -z "$TMUX" ]; then
# We're on a TTY and *not* in tmux
exec tmux -u
fi
fi
~/.profile
ログインしていないシェルではなくログインシェルで実行したいので、それを自分のコンピュータに入れることにしました。 (存在する場合、~/.bash_profile
bashは代わりに実行します~/.profile
。)