Bash

為什麼切換使用者時不讀取.bashrc?

  • November 26, 2021

在 RHEL7 上,當我使用 shell或作為 shellsu的使用者時,我看到啟動腳本的不同行為,儘管事實上這指向/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。

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