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