사용자를 전환할 때 .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

이 두 파일의 소스 코드를 얻으려면 .bashrc 파일에 추가하세요.

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

관련 정보