TTY 虛擬控制台 + tmux:似乎 ~/.bashrc 不止一次執行?
我更喜歡使用 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 中沒有發生。
我正在使用:
- Arch Linux (4.8.13-1)
- 代理
- 多路復用器
- 巴什什
- 完整
~/.bashrc
和其他配置(無~/.bash_profile
文件):https://gist.github.com/tobek/c8038c207f318528c3157b4a402aa2d9(我嘗試刪除 bashish 的東西,但行為仍然存在)這可能是什麼原因造成的?
修復#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
。)