Bash

TTY 虛擬控制台 + tmux:似乎 ~/.bashrc 不止一次執行?

  • January 8, 2017

我更喜歡使用 tmux 而不是預設的 linux 虛擬控制台(即agetty使用什麼),所以我把它放進去,~/.bashrc以便 tmux 在我登錄到 TTY 時自動執行:

if [[ "$(tty)" == /dev/tty* ]]; then
   tmux -u
fi

起初,這似乎可行: tmux 在我登錄後立即執行。但是,當我退出 tmux 時,tmux 會立即執行第二次!這是完整的行為:

  • ctrl+alt+f2
  • 登錄
  • 預設提示在 tmux 執行之前短暫可見
  • 算我一個tmux
  • ctrl+d
  • 文字[exited]短暫閃爍,然後我又回來tmux
  • ctrl+d
  • 返回預設終端tmux
  • ctrl+d
  • 現在我完全退出了

我無法追踪這一點 - 我嘗試記錄各種事情,設置環境變數,查看$SHLVL. 它實際上看起來.bashrc每次我登錄時都會執行 7 次!

我通常不在 X 中使用 tmux(我只使用 Konsole),但我嘗試設置 bashrc 讓 tmux 為所有非 tmux 會話執行,而這種雙重行為在 Konsole 中沒有發生。

我正在使用:

這可能是什麼原因造成的?

修復#1:

無法追踪它,但設法通過我的以下 hack 解決了這個問題~/.bashrc

if [ -z "$user_bashrc_already_run" ]; then
   user_bashrc_already_run=1
else
   return
fi

修復 #2:

設法正確地追踪了這一點。由於 TTY 是一個互動式登錄 shell,它同時執行/etc/profile~/.profile(X 中的終端仿真器不載入,因為它不是登錄 shell)。在我的情況下(我不知道為什麼,可能是 Bashish 安裝或其他),這些文件是相同的,並且都/etc/profile.d~/.bashrc.

~/.profile從解決問題中刪除所有重複的程式碼。

從https://serverfault.com/questions/261802/what-are-the-functional-differences-between-profile-bash-profile-and-bashrc中閱讀“呼叫”部分man bash和問題很有用。


如果有人遇到類似問題,這裡是執行 tmux 的更好方法,因為它會導致 shell 被 tmux 替換,而不是將 tmux 作為子 shell 執行:

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,因為我希望它在登錄 shell 上執行,而不是在非登錄 shell 上執行。(請注意,如果您有~/.bash_profile,bash 將執行它而不是~/.profile。)

引用自:https://unix.stackexchange.com/questions/335703