為什麼切換使用者時不讀取.bashrc?
在 RHEL7 上,當我使用 shell或作為 shell
su
的使用者時,我看到啟動腳本的不同行為,儘管事實上這指向/bin/sh``/bin/bash``/bin/sh``/bin/bash
我為使用者設置了以下腳本:
/home/my_user/.profile
echo Hello from .profile
/home/my_user/.bash_profile
# .bash_profile # Get the aliases and functions if [ -f ~/.bashrc ]; then . ~/.bashrc fi # User specific environment and startup programs PATH=$PATH:$HOME/.local/bin:$HOME/bin export PATH echo Hello from .bash_profile
/home/my_user/.bashrc
# .bashrc # Source global definitions if [ -f /etc/bashrc ]; then . /etc/bashrc fi # Uncomment the following line if you don't like systemctl's auto-paging feature: # export SYSTEMD_PAGER= # User specific aliases and functions echo Hello from .bashrc
現在,當我
su
指定時,/bin/bash
我得到以下輸出。[batwad@hellodave ~]$ sudo su -s /bin/bash my_user Hello from .bashrc [my_user@hellodave batwad]$
這是否意味著
.bash_profile
沒有被執行?畢竟,我沒有看到“Hello from .bash_profile”現在,當我
su
指定/bin/sh
(無論如何連結到/bin/bash
)時,我得到以下輸出。[batwad@hellodave ~]$ sudo su -s /bin/sh my_user sh-4.2$
沒有迴聲和不同的 shell 提示。是什麼賦予了?
更新
按照 redseven 的回答,我嘗試添加
-l
並得到另一種行為![bawtad@hellodave ~]$ sudo su -l -s /bin/sh my_user Last login: Thu Aug 16 11:44:38 UTC 2018 on pts/0 Hello from .profile -sh-4.2$
這次
.profile
用的就是這個!請注意,第一次嘗試時沒有出現“上次登錄”部分。
您看到的行為差異是
bash
確保與普通標準 Bourne shell 環境完全兼容的標準功能。從標準
bash
手冊頁(類型/INVOCATION
)的口中:如果使用名稱 sh 呼叫 bash,它會嘗試盡可能地模仿 sh 的歷史版本的啟動行為,同時也符合 POSIX 標準。
如果您想在通常登錄後使用所有設置,最好使用su的
-l
(或 simple )選項:-
man su:
-, -l, --login Provide an environment similar to what the user would expect had the user logged in directly.
通過該
-l
選項,您的 ~./bash_profile 將被使用(如果它包含在您的 .bash_profile 中,您的 .bashrc 也會被使用),否則您的 shell 不是登錄 shell,只會使用 ~/.bashrc。只有當您的 shell 是 bash 時,這些才是正確的。如果您有不同的預設 shell,或者您使用 -s 選項指定了不同的 shell,那麼這一切都取決於該 shell 的工作方式(可能使用或可能忽略 bash 設置)。即使 /bin/sh 是 bash 二進製文件的符號連結,它也是一個不同的 shell,二進製文件會檢測你啟動它的方式並啟動不同的 shell 而不是 bash。