터미널을 열 때 ~ / .bash_profile이 소스되지 않는 이유는 무엇입니까?


175

문제

Ubuntu 11.04 Virtual Machine이 있고 Java 개발 환경을 설정하고 싶었습니다. 나는 다음과 같이했다

  1. sudo apt-get install openjdk-6-jdk
  2. ~ / .bash_profile에 다음 항목을 추가했습니다.

    export JAVA_HOME=/usr/lib/jvm/java-6-openjdk
    
    export PATH=$PATH:$JAVA_HOME/bin
  3. 변경 사항을 저장하고 종료하십시오.

  4. 터미널을 다시 열고 다음을 입력하십시오.

    echo $JAVA_HOME   (blank)
    echo $PATH        (displayed, but not the JAVA_HOME value)
  5. JAVA_HOME의 내보내기 및 PATH에 대한 추가가 수행되지 않은 것처럼 아무 일도 일어나지 않았습니다.

해결책

~ / .bashrc 로 가서 파일 끝쪽에 다음 항목을 추가해야했습니다.

#Source bash_profile to set JAVA_HOME and add it to the PATH because for some reason is not being picked up
. ~/.bash_profile

질문

  1. 왜 그렇게해야합니까? bash_profile, bash_login 또는 그 두 가지가없는 프로파일은 bashrc 전에 먼저 실행된다고 생각했습니다.
  2. 이 경우 내 터미널이 비 로그인 셸입니까?
  3. 그렇다면 왜 터미널 다음에 su를하고 암호를 넣을 때 위에서 언급 한 내보내기를 설정 한 프로파일을 실행하지 않았습니까?

답변:


224

~/.bash_profile대화식 로그인 모드에서 시작할 때만 bash가 제공합니다. 일반적으로 콘솔 ( Ctrl+ Alt+ F1.. F6) 에서 로그인 하거나 ssh를 통해 연결 하는 경우에만 해당됩니다 .

그래픽으로 로그인하면 ~/.profilegnome-session (또는 사용중인 데스크탑 환경)을 시작하는 스크립트에 의해 구체적으로 제공됩니다. 그래서 ~/.bash_profile당신이 그래픽에 로그온하는 모든 경우에 공급되지 않습니다.

터미널을 열면 터미널은 (비 로그인) 대화식 모드에서 bash를 시작합니다 ~/.bashrc.

이러한 환경 변수를 넣을 수있는 올바른 위치는에 ~/.profile있으며 다음에 로그인 할 때 그 영향이 분명해집니다.

소싱 ~/.bash_profile에서하는 것은 ~/.bashrc잘못된 솔루션입니다. 그것은 다른 방향으로 있어야합니다. ~/.bash_profile소스해야합니다 ~/.bashrc.

왜 그런지에 대한 몇 가지 이력을 포함한 자세한 설명 은 DotFiles 를 참조하십시오 .

(APT를 통해 오픈 JDK를 설치할 때 정말 설정할 필요가 없습니다 있도록 보조 노트에, 심볼릭 링크는 패키지에서 설정해야합니다 JAVA_HOME또는 변경 PATH)


6
우분투 12의 사이드 바에서 터미널을 열 때 ~ / .profile 파일이로드되지 않습니다.
jcollum

3
@jcollum 잘 됐네요. .profile로그인 할 때만 제공됩니다.
geirha

2
오, 터미널을 여는 것은 로그인하는 것과 다릅니다 ... 터미널에 로그인하는 것을 생각하고있었습니다 .
jcollum

2
존재한다면 .profilebash는 무시 한다는 것을 명심하십시오 .bash_profile. 내 대답을 참조하십시오 여기man bash자세한 내용은.
terdon

3
@terdon, 예,하지만 bash는 그래픽으로 로그인 할 때 관여하지 않으므로 바로 진행됩니다 .profile.
geirha

48

다음을 실행하여 Bash 쉘이 로그인 쉘로 시작되었는지 확인할 수 있습니다.

shopt login_shell

응답이 off있으면 로그인 쉘을 실행하지 않는 것입니다.

Bash가 다른 구성 파일을 읽거나 읽는 방법에 대한 Bash 매뉴얼 호출 섹션을 읽으십시오.

발췌 man bash:

bash가 대화식 로그인 쉘 또는 --login 옵션이 있는 비 대화식 쉘로 호출되면 /etc/profile파일이 존재하는 경우 먼저 파일에서 명령을 읽고 실행 합니다. 해당 파일을 읽은 후, 그것은을 찾습니다 ~/.bash_profile, ~/.bash_login그리고 ~/.profile, 순서대로, 그리고 읽고 존재하고 읽을 수있는 첫 번째에서 명령을 실행합니다.

su반면 기본적으로 로그인 셸을 시작하지는 않으므로 --login옵션 을 사용하여 로그인 셸을 지정해야합니다 .


9
shotp login_shell 명령에 감사드립니다 . 대박!!
Viriato

27

프로파일 환경 설정을 편집하여 로그인 쉘 (예 : bash -l)을 사용하도록 gnome-terminal의 기본값을 변경할 수 있다고 언급 할 가치가 있다고 생각합니다.

편집-> 프로필 환경 설정-> 제목 및 명령 탭으로 이동하여 "로그인 명령으로 명령 실행"옵션을 확인하십시오.


1
이 설정을 사용하면 어떤 단점이 있습니까?
chrish

2
@ chris 당신은 많은 경우에 필요한 것보다 조금 더 많은 코드를로드하고 있습니다. 당신 ~/.bash_profile이 정말로 빨리 평가하고 있는지는 중요하지 않을 것입니다. 아마 그렇습니다. 확인하는 좋은 방법은 일반적으로 비용이 많이 드는 다른 프로세스에 대한 호출을 추적하는 것입니다.
vaab

14

터미널을 열거 나 실행 su하면 쉘이 로그인 쉘이 아니라 일반 대화식 쉘로 실행됩니다. 따라서 읽을 수 ~/.bashrc는 없습니다 ~/.bash_profile. 당신은 실행할 수 있습니다 su-l는 로그인 쉘과 같은 쉘을 실행하기 위해 옵션을 선택합니다.

GUI로 작업 할 때 쉘은 일반적으로 로그인 쉘로 실행되지 않으므로 일반적으로 모든 내용을 넣는 것이 ~/.bashrc좋습니다.


1
그것이 내가 한 일이며 효과가 있었지만 바닥에있는 사람이 말한 것을 확인하십시오. .... 두 가지 방법으로 작동합니다. 감사합니다.
Viriato

4

TL; DR

고전적인 권장 우분투 설정에서는 ~/.bash_profile특정 상황에서만 평가됩니다. 그리고 말이됩니다.

에 물건을 넣으면 ~/.bashrc매번 평가됩니다.

좋아, 이해하고 싶은데 왜 이것이 의미가 있습니까?

무슨 일이 일어나고 있는지 이해하기위한 요점 :

  • 리눅스의 모든 프로세스 는 환경 변수를 가지고 있고 사용합니다
  • 환경 변수는 상속됩니다
  • 따라서 모든 프로세스 의 아버지 에게 한 번 설정하면 충분합니다 (특히 계산 시간이 필요한 경우).
  • 모든 프로세스의 아버지는 일반적으로 기기에 로그인 한 후 시작 됩니다 (자격 증명 제공).
  • 컴퓨터에 로그인 할 때 한 번만 수행 할 수있는 작업이 있습니다 (예 : 새 메일 확인).

따라서 "로그인"시간은 일반적으로 다음과 같습니다.

  • 콘솔 모드에서 (Ctrl-Alt F1을 사용하여) 로그인하거나을 통해 ssh셸을 모든 프로세스의 아버지로 사용하면을로드합니다 ~/.bash_profile.
  • 그래픽 모드에서 세션을 열면 첫 번째 프로세스 ( gnome-session클래식 우분투의 경우)가를 담당합니다
    .profile.

좋아, 그럼 내 물건을 어디에 둘까?

다소 복잡합니다. 전체 내용은 여기에 있습니다 . 그러나 여기 우분투 사용자에게 일반적으로 사용되는 요약이 있습니다. 그래서 그것을 고려하면 :

  • bash껍질 을 사용 하고
  • 당신은이 ~/.bash_profile과에 따라 추천 의 로딩을 추가 ~/.bashrc로 당신의 ~/.bash_profile이상 얻을도록 호출 mecanism 무엇이든 평가됩니다 하나 개의 파일을 .

이것은 어디에 물건을 넣을 지에 대한 빠른 제안입니다.

  • ~ / .bashrc ( 권장 사항을 따르는 경우 모든 경우에 평가를 받습니다 )

    대한 빠른 평가 당신을위한 환경 변수와 코드 사용자 전용bash는 전용 명령 줄 사용 (예를 들어 별칭). 강타 는 환영합니다.

    그것은 다음과 같이 스스로로드됩니다 :

    • 그래픽 세션에서 새로운 쉘 창 / 창을 만듭니다.
    • 부름 bash
    • screen새 창 또는 탭. (안돼 tmux!)
    • "로그인 명령으로 명령 실행"옵션을 선택 하지 않으면 그래픽 콘솔 클라이언트의 모든 bash 인스턴스 ( terminator/ gnome-terminal...)

    그리고 사전 권장 사항 덕분에 다른 모든 경우에로드 될 것입니다.

  • ~ / .bash_profile ( 특정 경우에만 평가됩니다 )

    들어 느린 평가 당신을위한 환경 변수와 코드 사용자 전용콘솔 세션을 처리합니다. 강타 는 환영합니다. 그것은로드됩니다 :

    • 콘솔 로그인 (Ctrl-Alt F1)
    • 이 기계에 ssh 로그인,
    • tmux새 창 또는 창 (기본 설정) ( screen! 아님)
    • 명시 적으로 호출 bash -l,
    • "로그인 명령으로 명령 실행"옵션을 선택한 경우에만 그래픽 콘솔 클라이언트 ( terminator/ gnome-terminal...)의 모든 bash 인스턴스
  • ~ / .profile (그래픽 세션에서만 평가됨)

    들어 느린 평가 환경 변수에 없는 bashism 당신을위한 전용 사용자 와 모든 그래픽 세션 처리합니다. 그래픽 UI에 로그인하면로드됩니다.


bash가 프로파일 파일을로드하는 .profile경우 .bash_profile존재하지 않는 경우 로드 됩니다 .
muru

명확한 설명을 주셔서 대단히 감사합니다. 그것은 나와 같은 초보자를 돕습니다. Mac Mojave에서 ~ / .bashrc에 변수를 넣고 소스를 입력 한 다음 envenv 변수가 설정되어 있지 않으면 iTerm을 닫고 다시 열어보십시오. 그러나 Android Studio 및 기타 앱을 설치할 때 모든 환경이에 설정되어 있음을 알았습니다 /.bash_profile. 그래서 내가 추가했을 때 /.bash_profile매력처럼 작동했습니다. 왜 그런 겁니까?
sofs1
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.