로그인하지 않은 쉘에 대해 / etc / profile이 호출되지 않는 이유는 무엇입니까?


51

로그인 및 비 로그인 쉘은 다음과 같이 정의됩니다.

su - $USER # will give you a login shell
bash # will give you a non-login shell

konsole (kde)을 시작할 때와 같이 비 로그인 쉘에 대해서는 / etc / profile이 호출되지 않습니다. / etc / profile은 로그인 쉘에 대해서만 호출됩니다.

왜 그런 겁니까? 이것의 이론적 근거를 이해하고 싶기 때문에 설명해주십시오.

답변:


99

/etc/profile 특정 목적이기 때문에 로그인 쉘에 대해서만 호출됩니다.

로그인 쉘 이 아닌 대화식 쉘에 대해 명령을 실행하고을 사용하려면 또는에 bash넣으십시오 .~/.bashrc/etc/bash.bashrc

"프로파일"파일의 목적은 로그인 쉘에 대해서만 실행되어야하는 명령을 포함하는 것입니다. 이러한 파일은 다음과 같습니다.

  • /etc/profile로그인 쉘로 시작하면 모든 Bourne 호환 쉘 ( bash및 포함 dash)이 실행합니다 .

  • 에서 스크립트 /etc/profile.d.

    이것은 Bourne 스타일 쉘용이지만 쉘 실행 파일 자체에는 코딩되어 있지 않습니다. 오히려, 명령은이를 /etc/profile호출합니다. 예를 들어, Ubuntu 12.04 시스템에서 /etc/profile다음 행을 포함합니다.

    if [ -d /etc/profile.d ]; then
      for i in /etc/profile.d/*.sh; do
        if [ -r $i ]; then
          . $i
        fi
      done
      unset i
    fi
    
  • .profile 사용자의 홈 디렉토리에서 로그인 쉘로 시작할 때 Bourne 호환 쉘에 의해 실행됩니다 (재정의되지 않은 경우 아래 참조).

  • .bash_profile또는 .bash_login사용자의 홈 디렉토리에 있습니다. 이 외의 다른 쉘에서는 무시됩니다 bash. 그러나 .bash_profile존재하는 경우 대신bash 실행하십시오 . 경우 존재하지 않지만 존재, 그 대신 실행됩니다 . .profile.bash_profile.bash_login.profile

    (그러나 .bash_profile또는 .bash_login존재하는 경우 * 명시 적으로을 호출하도록 작성 되는 것이 일반적입니다 .profile.)

    쉘 특정 프로파일 파일 의 장점은 해당 쉘에만 유효한 명령 또는 구문을 포함 할 수 있다는 것입니다. 예를 들어 / 에서 [[평가 연산자를 사용할 수는 있지만 평가 연산자를 사용한 다음 쉘로 로그인 하면 실패합니다..bash_profile.bash_login.profiledash

"프로필"파일에 들어가야 할 것

"프로파일"파일에는 로그인 시작시 한 번만 실행해야하는 명령이 포함되어야합니다. (이것은 로그인 쉘로 시작하는 그래픽 로그인도 포함합니다.) 쉘이 대화식이면 쉘을 실행하는 사용자가 로그온했을 가능성이 있으므로 아마도 조상 (시작했거나 시작한 시작)을 가지고있을 것입니다. 또는 로그인 쉘 등을 시작했습니다.

다음과 같은 이유로 명령을 한 번만 실행할 수도 있습니다.

  1. 로그인 당 한 번 이상 실행할 이유가 없거나 비효율적 이거나
  2. 로그인 당 두 번 이상 실행하기를 원하지 않는 결과가 발생합니다.

바람직하지 않은 결과가 발생하는 두 번째 상황의 예로, 모든 사용자에게 기본적으로 나타나는 다음 행을 고려하십시오 ~/.profile.

# set PATH so it includes user's private bin if it exists
if [ -d "$HOME/bin" ] ; then
    PATH="$HOME/bin:$PATH"
fi

SSH를 시작하고 다른 쉘 (예 :)을 실행했다고 가정 zsh하고 어느 시점에서 일시적으로 돌아가고 bash환경을 유지하고 싶었다는 것을 알게 된 다음 ( ) bash에서 다시 실행 한 다음 쉘을 부분으로 실행하는 zsh것과 같은 프로그램 mc을 실행했습니다 인터페이스의. 경우 bin홈 폴더에 존재하는 사용자 이름은 james당신의 PATH가장 안쪽 껍질 같은 것입니다 :

/home/james/bin:/home/james/bin:/home/james/bin:/home/james/bin:/usr/lib/lightdm/lightdm:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games

그것은 비효율적이며 (더 중요하게는)의 내용을 이해하기 어렵게 만듭니다 PATH.

그러나 이것은 결코 재앙이 아닙니다. 내가 알 수있는 한, 모든 대화식 쉘이 "프로파일"파일을 소스로 만들면 기본 구성에서 끔찍한 일이 발생하지 않습니다 . 그러나 "프로파일"파일의 목적은 로그인 당 한 번만 실행되는 명령을 포함하는 것이므로 사용자 또는 관리자는 로그인 쉘을 시작할 때만 실행 해야하는 명령을 프로파일에 추가 할 수 있습니다 .

모든 대화식 쉘을 실행할 명령을 넣을 위치

를 사용하는 경우 bash모든 대화식 쉘에서 실행되는 명령 파일이 있습니다.

  • /etc/bash.bashrc
  • .bashrc 사용자의 홈 디렉토리에 있습니다.

이것은 가장 일반적으로 사용되는 명령에 사용됩니다

  1. 그들이 실행하는 쉘의 환경에 영향을 - 심지어 아이 껍질, 또는
  2. 로그인 쉘이 아닌 경우에도 실행해야합니다.

예를 들어, 명령 줄 탭 완성은 일반적으로 bash로그인 쉘 인지 여부에 관계없이 활성화되어야합니다 . 그래서 이것은 다음에 나타납니다 ~/.bashrc:

if [ -f /etc/bash_completion ] && ! shopt -oq posix; then
    . /etc/bash_completion
fi

가, 12 모두 적용이이 일 안에 실행되는 다른 조개에 이월되지 않으며, 탭 완료에서 작동합니다 bash내가 다른 쉘에 로그인 한 경우에도 마찬가지입니다.

로그인 쉘 및 대화식 비 로그인 쉘에 대한 명령을 넣을 위치

bash로그인 쉘과 대화식 쉘에서 명령을 사용 하고 있고 로그인 쉘이 아닌 명령을 사용하려면 일반적으로 /etc/bash.bashrc또는 에 넣는 것으로 충분합니다~/.bashrc . 이것은 기본적으로 때문입니다 /etc/profile~/.profile명시 적으로 실행합니다. 예를 들어, ~/.profile이 있습니다 :

# if running bash
if [ -n "$BASH_VERSION" ]; then
    # include .bashrc if it exists
    if [ -f "$HOME/.bashrc" ]; then
        . "$HOME/.bashrc"
    fi
fi

(와 유사하게 /etc/profile소스 /etc/bash.bashrc입니다 bash.)

따라서 대화식 bash쉘 을 시작할 때 " 로그인 "파일과 "rc"파일이 모두 실행됩니다 (로그인 쉘인지 여부).

비 대화식 쉘에서 실행할 명령을 넣을 위치

모든 비 대화식 쉘이 실행되도록 명령을 지정하지 않을 수도 있습니다. 스크립트가 실행될 때마다 실행됩니다 (스크립트를 실행하도록 구성한 쉘에서 스크립트가 실행되는 경우).

이로 인해 상당한 파손이 발생할 수 있습니다. 이 작업을 수행 할 때 사용중인 계정 외에 시스템에 관리자 계정이없는 경우 관리자 계정을 만들 수 있습니다. 실수를 쉽게 해결할 수 있습니다.

에서 bash의 "RC"파일이 실제로 실행되는 쉘이 대화 형인지 여부 . 그러나 상단에는 다음과 같이 말합니다.

# If not running interactively, don't do anything
[ -z "$PS1" ] && return

따라서 스크립트를 실행하기 위해 실행되는 것과 같은 비 대화식 쉘에서도 자동으로 실행되는 명령이 필요한 경우 해당 행 앞에 명령을 추가 할 수 있습니다 .

로그인 쉘 시작

로그인하면 로그인 쉘이 시작됩니다. 그 후 쉘이 로그인 쉘로 작동하도록하려면 -l플래그로 시작하십시오 ( l ogin을 의미 ). 예를 들면 다음과 같습니다.

다른 사용자 로 로그인하지 않으려면 로그인 쉘을 사용하지 않고 로그인 쉘을 시작하는 가장 좋은 방법 입니다. 그런 다음 다음을 사용하십시오.

  • sudo -i대한 root(사용 sudo -s비 로그인에 대한 대화 형 루트 쉘)
  • sudo -u username -i 모든 사용자
  • su - usernameroot사용자 용 ( 로그인하지 않은 대화식 루트 셸에 사용)su username

무엇 초기 로그인 쉘은?

초기 로그인 쉘은 A와 동일 로그인 쉘 . 이 답변의 모든 곳에 "login shell"이라고 적혀 있는데 "initial login shell"이라고 말할 수 있습니다 (이 부분은 이미 이해가 멈췄을 것입니다).

초기 로그인 쉘 이라는 용어의 한 가지 이유 는 로그인 쉘 이 다른 의미 로 사용되어 로그온 할 때 실행되는 쉘로 사용 되는 프로그램 을 식별하기 때문입니다. 이것은 다음과 같은 로그인 쉘 의 의미입니다 .

  • " OpenBSD 의 기본 로그인 쉘은 ksh;; 우분투에서는 bash입니다."
  • "로 로그인 쉘을 변경할 수 있습니다 chsh."

추가 자료


4
Stack Exchange 사이트의 모든 질문에 대한 최상의 답변 중 하나입니다.
Mark E. Haase 2019

1
> "프로파일"파일에는 로그인 시작시 한 번만 실행해야하는 명령이 포함되어야합니다. (로그인 쉘로 시작하는 그래픽 로그인도 포함됩니다.) No no no no no! 절대 그렇지 않습니다! 모든 Bourne과 같은 쉘은 대화식 로그인 쉘 세션, 즉 -i 옵션으로 시작한 세션 또는 제어 터미널에 연결된 세션 에서만 .profile을 읽습니다 (쉘이 디스플레이 관리자에 의해 시작된 경우 둘 다 해당되지 않음). 이것이 사실 인 이유는이 파일의 요점은 환경뿐만 아니라 사용자의 터미널 을 설정하기 때문 입니다. 디스플레이 관리자 tr

엘리아, 나는 데릭의 나머지 의견을 여기에 재현 했지만 평판 요구 사항으로 인해 응답 할 수는 없지만 회신 알림을받을 수 있도록 위의 그루터기를 남겼습니다. 나는 그에게 위의 채팅방에 대한 쓰기 권한을 부여했습니다.
Seth

1
In bash, the "rc" files are actually run whether the shell is interactive or not. 부정확하다. /etc/bash.bashrc는 /etc/bash.profile에 의해 트리거됩니다.
okwap

okwap이 옳습니다. rc 파일은 비 대화식 쉘에서 호출되지 않습니다. 이것은 간결하고 정확합니다.
Nick Allen
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.