之前在debian遇到這種情況,新增加的用戶,每次登入的路徑都顯示sh-42$必須su - 使用者名稱才能恢復正常,且使用者目錄下的.bashrc和其他的設定檔都沒有辦法source,導致一系列問題。
如果是這種情況,極有可能是linux的預設啟動shell不正確,su切換成超級用戶,vi /etc/passwd查看用戶對應的啟動shell,對比其他正常的用戶的啟動shell ,如果不一樣則修改成相同即可。 。
例如其他正常使用者的shell為/bin/bash ,異常使用者對應的shell是/bin/sh,則將其改為/bin/bash。
bash shell使用一些啟動檔案去設定環境變量,這些啟動檔案為shell本身和系統使用者確定某些bash shell配置,在本文中,我們將了解.bashrc .bash-profile 和.profile之間的差異。
Bash在互動式shell中提供了兩個模式選項,登入和非登入(login and non-login) 。
當我們使用ssh登入系統時,我們得到一個互動式登入的shell (interactive login shell),這個shell在被呼叫時會讀取啟動檔。
然而,當我們在一個已經登入的shell上呼叫一個新的shell時,我們得到的是一個互動的、非登入的shell。這個shell只執行.bashrc檔案
當shell不需要任何人類幹預即可執行指令時,我們稱之為非互動式shell (non-interactive shell)。例如,當腳本產生子shell來執行命令時,子shell是非互動式shell,子shell不會執行任何啟動文件,它從創建它的shell中繼承了環境變數。
啟動檔案包含shell啟動時需要執行的指令。因此,shell會自動執行這些啟動檔案中的指令來設定shell。這個過程發生在顯示命令提示字元之前。
3.1 .bash_profile 的意義
.bash_profile檔案包含用於設定環境變數的命令,因此shell將繼承這些變數。
在互動式登入shell中,bash先找 /etc/profile 檔案。如果找到,bash將在目前shell中讀取並執行它。結果是 /etc/profile為所有使用者設定環境配置
類似地,bash接著檢查主目錄(cd ~ 進入的目錄為主目錄)中是否存在 .bash_profile。如果存在,則bash在目前shell中執行 .bash_profile,Bash然後停止尋找其他文件,如 .bash_login 和 .profile。
如果bash沒有找到 .bash_profile,那麼它將依照順序尋找 .bash_login 和 .profile,並且只執行第一個可讀的檔案。
讓我們研究一個範例 .bash_profile檔。這裡我們重新設定並導出PATH變數
echo "Bash_profile execution starts.." PATH=$PATH:$HOME/bin; export PATH; echo "Bash_profile execution stops.."
在互動式登入shell的命令提示字元之前,我們將看到下面的輸出
Bash_profile execution starts.. Bash_profile execution stops.. [example@example ~]$
3.2 .bashrc 的意義
.bashrc包含特定於bash shell的指令。每個互動式非登入shell首先讀取 .bashrc,通常,.bashrc是添加別名和bash相關功能的最佳場所。
bash shell在主目錄中尋找 .bashrc文件,並使用source在目前shell中執行它。
讓我們透過範例認識.bashrc檔案
echo "Bashrc execution starts.." alias elui='top -c -u $USER' alias ll='ls -lrt' echo "Bashrc execution stops.."
在互動式非登入shell的命令提示字元之前,我們將看到下面的輸出
[example@example ~]$ bash Bashrc execution starts.. Bashrc execution stops.. [example@example ~]$
3.2 .profile 的意義
在互動式shell登入過程中,如果在主目錄中不存在.bash_profile,則bash尋找.bash_login,如果發現**.bash_login** 則bash執行它。如果 .bash_login 不存在主目錄中,則bash尋找 .profile 並執行它。
.profile 可以保持與 .bash_profile 或 .bash_login 的設定。它控制著出現的提示,鍵盤聲音,要打開的 shell 以及覆蓋 /etc/profile檔案中設定的變數的單一設定檔設定。
每次互動登入時,bash shell都會執行 .bash_profile。如果在主目錄中找不到 .bash_profile,bash將執行從 .bash_login 和 .profile 中找到的第一個可讀檔案。但是,在每次互動式非登入shell啟動時,bash都會 .bashrc。
通常情況下,環境變數會被放入 .bash_profile。由於互動式登入shell是第一個shell,因此環境設定所需的所有預設設定都被放入**.bash_profile**。因此,它們只設定一次而且在所有子shell中繼承。
同樣地,別名和函數也會被放入.bashrc 確保每次從現有環境中啟動shell時都加載這些
#然而,為了避免登入和非登入互動shell設置的差異。 .bash_profile 呼叫 .bashrc。因此,我們將看到下面的程式碼片段被插入**.bash_profile**,以便在每個互動式登入shell上 .bashrc 也在同樣shell執行:
if [ -f ~/.bashrc ]; then . ~/.bashrc; fi PATH=$PATH:$HOME/bin export PATH
注意:
总而言之,在使用环境之前,shell需要其启动文件以配置shell环境。
在本文中,我们检查了各种shell模式。然后,我们了解了各种bash启动文件的重要性。最后,我们检查了这些启动文件之间的差异。
以上是linux用戶source .bashrc或.profile找不到檔案怎麼解決的詳細內容。更多資訊請關注PHP中文網其他相關文章!