Bash

~/.bashrc 腳本在 ssh 登錄時無法正常執行,但可以與源 ~/.bashrc 一起正常工作

  • September 17, 2015

為了跟踪我在不同選項卡中打開的 ssh 連接,我使用以下 ~/.bashrc 腳本:

function set-title() {
 if [[ -z "$ORIG" ]]; then
   ORIG=$PS1
 fi
 TITLE="\[\e]2;$@\a\]"
 PS1=${ORIG}${TITLE}
}
set-title <SERVERNAME>;
echo "set-title <SERVERNAME>"

我為我沒有打開 ssh 的選項卡(使用set-title LOCAL;)和兩個不同的伺服器上執行此操作。在一台伺服器上,它完全符合我的要求並更改了選項卡名稱,但在另一台伺服器上它沒有更改。

當我set-title <SERVERNAME>;自己在命令行上鍵入時,它確實會更改選項卡名稱,並且在登錄時會 echo "set-title <SERVERNAME>"。另外,如果我這樣做source ~/.bashrc,它會按預期工作,所以只有在登錄到伺服器時它才會不起作用。

在它工作的伺服器上登錄執行Scientific Linux release 6.7 (Carbon),在它不工作的伺服器上執行CentOS release 6.6 (Final)。什麼可能導致set-title <SERVERNAME>;.bashrc 腳本在登錄時無法正確執行?

沒有更多資訊,無法回答這個問題。

但是,我想最有可能的情況是.bashrc登錄時由.bash_profile或來源.profile- 可能類似於以下內容:

# source the users bashrc if it exists
if [ -f "${HOME}/.bashrc" ] ; then
 source "${HOME}/.bashrc"
fi

我猜想在沒有設置標題的系統上,該PS變數在登錄腳本的稍後階段被設置為另一個值。

PS1變數實際上應該在僅在登錄時執行的 Bash 配置文件(.bash_profile.profile)中設置,並且該變數應exported作為環境變數編輯,以便其值被任何子 shell 繼承。

PS1=${ORIG}${TITLE}
export PS1

或使用適用於 Bash shell 的簡寫:

export PS1=${ORIG}${TITLE}

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