TTY仮想コンソール+ tmux:〜/ .bashrcが何度も実行されていると思いますか?

TTY仮想コンソール+ tmux:〜/ .bashrcが何度も実行されていると思いますか?

私はデフォルトの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_profilebashは代わりに実行します~/.profile。)

おすすめ記事