ユーザーを切り替えると.bashrcを読むことができないのはなぜですか?

ユーザーを切り替えると.bashrcを読むことができないのはなぜですか?

RHEL7では、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$

エコーがなく、他のシェルプロンプトが表示されます。何を提供しますか?

修正する

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私が今回使ったのはまさにこれ!最初の試行では、「最後のログイン」セクションは表示されません。

答え1

私は同じ問題があり、Ubuntu 20.04.3その中に次の行があったからです~/.bashrc

# If not running interactively, don't do anything
case $- in
    *i*) ;;
      *) return;;
esac

私の解決策は、重要なコマンドをこのブロックの前に移動することでした~/.bashrc(デフォルトではnvmとnode.jsをロードするために必要な行)。

答え2

正常にログインした後にすべての設定を使用するには、su -l(またはsimple)オプションを使用することをお勧めします。-

万数:

       -, -l, --login
       Provide an environment similar to what the user would expect had the user logged in
       directly.

この-lオプションを使用すると、〜./bash_profileが使用されます(.bash_profileに含まれている場合は.bashrcも含まれます)。それ以外の場合、シェルはログインシェルではなく、~/.bashrcのみを使用します。

これは、シェルがbashの場合にのみ正確です。別のデフォルトシェルがある場合、または-sオプションを使用して別のシェルを指定した場合、すべてはそのシェルの動作に依存します(bash設定を有効または無効にすることができます)。 /bin/sh は bash バイナリへのシンボリックリンクですが、別のシェルであり、バイナリはユーザーがどのように起動したかを検出し、 bash 以外のシェルを起動します。

答え3

表示される動作の違いは、bash一般的な標準Bourneシェル環境との完全な互換性を確保するための標準機能です。

bash標準のマニュアルページ(タイプ)から/INVOCATION

bash が sh 名で呼び出されると、POSIX 標準に準拠しながら、sh の以前のバージョンの起動動作をできるだけ近い模倣しようとします。

答え4

bashがログインではなく対話型シェルで始まる場合は、ユーザー固有の構成とシステム全体の構成の両方を~/.bash_bashrc検索します(bashのマニュアルページを参照)。~/.bashrc/etc/bash.bashrc

ただし、インタラクティブなログインシェル(を追加して実行できます)で実行されている場合は、最初にユーザーに対してor(使用可能なものをすべて使用できます--login。システム全体の構成と構成~/.profile~/.bash_profile~/.profile~/.bash_profile/etc/profile

これら2つのファイルのソースコードを取得するには、.bashrcファイルに追加してください。

 if [ -f $HOME/.profile ]; then
     . /etc/profile
 fi

関連情報