.bashrc, .profile, .bash_profile 등 중에서 선택 [중복]


197

이 질문에는 이미 답변이 있습니다.

이 창피하지만, 쉘 정의가에 가야하는 경우 POSIX 시스템을 풀 타임을 사용하는 많은 년 후에, 나는 아직도 알아내는 힘든 시간을 가지고 .bashrc, .profile다른 곳, 또는. 와 같은 일부 OS 관련 구성 파일은 말할 것도 없습니다 .pam_environment.

예, 설명서를 통해 퍼즐을 풀고 각 파일이로드되거나로드되지 않은 경우를 배우는 방법을 알고 있습니다. 내가 궁금한 것은 누군가가 특정 유형의 사용자 정의를 넣을 파일을 결정하는 방법에 대한 포괄적 인 지침을 모두 가지고 있는지 여부입니다.


6
이 질문은 중복 된 것으로 표시되어서는 안됩니다. 이유는 .profile이 추가 된 질문에서 사용할 수 없습니다.
Premraj

답변:


222

TL; DR :

  • ~/.bash_profile매우 간단하고로드되어야 .profile하며 .bashrc(순서대로)

  • ~/.profile환경 변수 ( PATH및 친구) 와 같이 bash와 특별히 관련이없는 것들이 있습니다.

  • ~/.bashrc대화식 명령 행에서 원하는 것을 갖습니다. EDITOR내가 사용할 명령 프롬프트, 변수, bash 별명

다른 참고 사항 :

  • 그래픽 응용 프로그램에서 사용할 수 있거나 sh (또는 bash로 호출 sh)에 사용할 수있는 모든 것은~/.profile

  • ~/.bashrc 아무것도 출력하지 않아야합니다

  • 로그인 쉘에만 사용할 수있는 것은 ~/.profile

  • ~/.bash_login존재하지 않는지 확인하십시오 .


3
+1을 사용하면 ~/.profile/ bin / sh를 명시 적으로 실행하는 GDM / LightDM / LXDM과 같은 서비스 환경을 올바르게 설정할 수 있습니다.
grawity

12
.bashrc결과물에 많은 것들이 있습니다. 특히 인사말 출력을 어디에 두어야합니까?
Calimo

14
@Calimo : 대화식 모드로만 출력합니다. 을 사용하여 [[ $- == *i* ]], 즉 특수 $-변수 에서 'i'를 찾아서 테스트 할 수 있습니다 . 물론 bash가 .bashrc비 대화식 모드 로 읽도록 컴파일 된 시스템의 경우에만 중요 합니다. (즉., 데비안하지만 아치입니다)하지만 사용하여 연결을 시도 신비 오류 메시지의 흔한 원인이다 sftp하거나 scp또는 유사한 도구를 제공합니다.
grawity

4
.bash_login이 존재하지 않는 이유는 무엇입니까? 무엇을합니까?
tedder42

11
@ tedder42 : 그것은 같은 작업을 수행 .bash_profile하고 .profile. 그러나 bash는 3 개 중 첫 번째 만 읽습니다. 당신이있는 경우 의미, .bash_login후 모두 .profile.bash_profile신비 무시됩니다.
grawity

54

지난 몇 년 동안, 나는 낭비 할 시간이 많이 했어, 그래서 나는 10 분보다 약간 더 많은 것을 위해이 연구. 이것이 가장 좋은 레이아웃인지 전혀 모르겠습니다. 거의 모든 경우에 올바르게 작동하는 것입니다.

요구 사항:

  • ~/.profile / bin / sh와 호환 가능해야합니다. 여기에는 bash, dash, ksh가 포함되어 있습니다.

  • 환경 변수는 콘솔 로그인 (예 : '로그인'쉘)과 그래픽 로그인 (예 : GDM, LightDM 또는 LXDM과 같은 디스플레이 관리자) 모두가 읽는 파일에 넣어야합니다.

  • 필요에있는 약간의 포인트가 모두 ~/.profile 하고 ~/.bash_profile. 후자가 누락 된 경우, bash는 행복하게 이전 사용하고, 어떤 bash는 특정 라인에 대한 체크와 함께 보호 할 수있다 $BASH$BASH_VERSION.

  • 사이의 분리 *profile*rc전자는 '로그인'쉘에 사용하고 터미널 창을 열 때마다 후자된다는 점이다. 그러나 '로그인'모드의 bash는 소스 ~/.bashrc가 아니므로 ~/.profile수동으로 수행해야합니다.

간단한 구성은 다음과 같습니다

  • ~/.profile(bash는 특정 제외한) 모든 환경 변수를 설정하는 것을, 아마도 한두 줄을 인쇄 한 후 소스를 ~/.bashrc달리 쉬 호환 구문을 고집, bash에 의해 실행되는 경우.

    수출 TZ = "유럽 / 파리"
    EDITOR = "vim"내보내기
    [ "$ BASH"] 인 경우; 그때
        . ~ / .bashrc
    fi
    가동 시간
    
  • ~/.bashrc수표로 보호 어떤 쉘 특정 설정, 수행하는 대화 형 모드를 같은 것들을 깨는 피하기 위해 sftp데비안에 (bash는이 옵션을 사용하여 컴파일로드 ~/.bashrc도 (non-interactive) 형 모드 쉘의 경우) :

    [[$-== * i *]] || 0을 반환
    
    PS1 = '\ h \ w \ $'
    
    start () {sudo 서비스 "$ 1"시작; }
    

그러나 특정 비 대화식 명령 (예 ssh <host> ls:)이 건너 뛰는 문제도 ~/.profile있지만 환경 변수는 매우 유용합니다.

  • 특정 배포판 (예 : 데비안) ~/.bashrc은 대화식이 아닌 로그인 을 소스로하는 옵션으로 bash를 컴파일 합니다. 이 경우, 나는 그것이 유용한 모든 환경 변수 (이동하는 것으로 나타났습니다 export ...별도의 파일에 라인), ~/.environ및에서를 소스로 모두 .profile.bashrc두 번 그 일을 피하기 위해 가드 :

    만약 ! [ "$ PREFIX"]; 다음    # 또는 $ 에디터, 또는 $ TZ, 또는 ... 
        . ~ / .environ            # 일반적으로 .environ 자체가 설정하는 모든 변수
    fi
    
  • 불행히도 다른 배포판 (예 : 아치)의 경우 좋은 해결책을 찾지 못했습니다. 한 가지 가능성은 다음을 입력하여 (기본적으로 활성화 된) pam_env PAM 모듈을 사용하는 것입니다 ~/.pam_environment.

    BASH_ENV =. /. environ         # 오타가 아닙니다. 그것은 경로이어야하지만 ~ 작동하지 않습니다
    

    그런 다음 물론으로 업데이트 ~/.environ하십시오 unset BASH_ENV.


결론? 껍질은 고통입니다. 환경 변수는 고통입니다. 배포판 특정 컴파일 타임 옵션은 엉덩이에 엄청난 고통입니다.


2
마지막 단락에 대한 +1,하지만 난 소싱 선호 .profile.bashrc에서 .bash_profile와 유지 .profile깨끗한.
nyuszika7 시간

@ nyuszika7h : 내이 .profile 깨끗합니다 , 감사합니다.
grawity

1
창을 열 때마다 주석이 다시 나타납니다. OSX의 다른 방식
Mark

1
"아주 작은 지점이 모두 필요에가 ~/.profile~/.bash_profile"나는 disdagree. 이유는 Dan의 답변을 참조하십시오.
rubenvb

@rubenvb 관련 부품을 인용 할 수 있습니까? 나는 조건부로 특정 부분 만을 가지고 .profile지키는 것이 좋다고 생각합니다 bash.
Kelvin

36

ShreevatsaR 의이 훌륭한 블로그 게시물을 살펴보십시오 . 다음은 추출 내용이지만 블로그 게시물로 이동하면 "로그인 쉘"과 같은 용어에 대한 설명, 순서도 및 Zsh와 유사한 표가 포함됩니다.

Bash의 경우 다음과 같이 작동합니다. 해당 열을 읽으십시오. A, B, C 등을 실행합니다. B1, B2, B3은 발견 된 파일 중 첫 번째 파일 만 실행 함을 의미합니다.

+----------------+-----------+-----------+------+
|                |Interactive|Interactive|Script|
|                |login      |non-login  |      |
+----------------+-----------+-----------+------+
|/etc/profile    |   A       |           |      |
+----------------+-----------+-----------+------+
|/etc/bash.bashrc|           |    A      |      |
+----------------+-----------+-----------+------+
|~/.bashrc       |           |    B      |      |
+----------------+-----------+-----------+------+
|~/.bash_profile |   B1      |           |      |
+----------------+-----------+-----------+------+
|~/.bash_login   |   B2      |           |      |
+----------------+-----------+-----------+------+
|~/.profile      |   B3      |           |      |
+----------------+-----------+-----------+------+
|BASH_ENV        |           |           |  A   |
+----------------+-----------+-----------+------+
|                |           |           |      |
+----------------+-----------+-----------+------+
|                |           |           |      |
+----------------+-----------+-----------+------+
|~/.bash_logout  |    C      |           |      |
+----------------+-----------+-----------+------+

이거 좋은데. 일반적으로 /etc/profile호출 /etc/bash.bashrc하고 ~/.profile호출 한다는 점에 유의해야 합니다 ~.bashrc. 그래서 효과적으로, /etc/bash.bashrc그리고 ~/.bashrc뿐만 아니라 대화 형 로그인을 위해 실행되고있다.
wisbucky

일부 배포판은이 체계를 (이상한 결과로) 무시하는 것 같습니다. 예를 들어 여기에서 사용하려면 내 bugreport를 참조하십시오 : bugzilla.opensuse.org/show_bug.cgi?id=1078124
Christian Herenz

Btw. 적어도 bash에서는 bash가 다음을 통해 호출 될 때 해당 파일이 실행되지 않습니다./bin/sh
JepZ

@JepZ 맞습니다. 세 번째 열 "스크립트"가 설명합니다.
Flimm

1
@Flimm 글쎄, '스크립트'열은 bash (예 : / bin / bash) 를 통해 비 대화식 스크립트를 시작할 때 발생하는 상황을 설명합니다 . 그러나 sh 를 통해 스크립트를 시작하면 (/ bin / sh는 / bin / bash에 대한 심볼릭 링크) 위의 어느 것도 실행되지 않습니다 (조차도 BASH_ENV). bash 매뉴얼 페이지의 관련 단락은을 검색하여 찾을 수 있습니다 If bash is invoked with the name sh.
JepZ

21

나는 당신에게 "포괄적 인"지침을 제공합니다 :

  • 존재하는 경우 확인 .bash_profile.profile로드.bashrc [ -r $HOME/.bashrc ] && source $HOME/.bashrc
  • 에 다른 모든 것을 넣습니다 .bashrc.
  • 걱정 그만해.
  • 4 년마다 10 분 동안이 질문에 대해 연구하고 포기하지 않고 "걱정하지 마십시오"로 돌아가십시오.

편집 : 누군가가 그것을 믿고 싶어하는 경우에 대비하여 "포괄적"에 겁 따옴표를 추가했습니다. ;)


3
모두를 갖는 .bash_profile.profile비트 중복; 후자 만 필요합니다. if [ "$BASH" ] && [ -r ~/.bashrc ]; then . ~/.bashrc; fi/ bin / sh 스크립트에서 파일을 수동으로 제공하는 프로그램 (즉, gdm / lightdm)이 있으므로 / bin / sh-proof로 만들어야합니다 . 이것은 또한 유지 된 환경 .bashrc이 비효율적 임을 의미합니다 . 어려운 방법을 여러 번 발견 한 것처럼 "포괄적 인"지침이 많은 시스템에서 작동하지 않기 때문에 -1이 필요했습니다.
grawity

문제 없습니다. 저는 단순히 "포괄적 인"혀가 아닌 포괄적 인 답변에 대해 -1을 기꺼이 지불하고 귀하는 그 타이틀을 확실히 얻었습니다.
기계 물고기

0

나는 이것을 알아 내려고 노력하고 포기하고 하나의 스크립트 ( ~/.shell-setup)를 만들었 습니다.

이 방법에는 ~/.shell-setup두 가지 기능 이 필요 합니다.

  1. 반복적으로 소싱 할 때도 한 번만 실행 ( Include guards 사용 )
  2. 원치 않는 출력을 생성하지 마십시오 (출력이 정상일 때 감지)

쉘 스크립트에서 많이 사용되지는 않지만 # 1은 꽤 표준입니다.

# 2는 더 까다 롭습니다. bash에서 사용하는 내용은 다음과 같습니다.

if [ "" == "$BASH_EXECUTION_STRING" -a "" == "$DESKTOP_SESSION" ]; then
    echo "Hello user!" # ... etc
fi

불행히도 나는 내가 어떻게 생각해 왔는지, 왜 대화 형 쉘감지하는 것만으로는 충분 하지 않은지 기억하지 못합니다 .


-2

모든 것을 넣어 .bashrc다음 소스 .bashrc에서.profile

bash 매뉴얼 페이지 (OS X 10.9)에서 :

로그인 쉘이 아닌 대화식 쉘이 시작될 때 bash는 ~ / .bashrc에서 해당 파일이있는 경우 명령을 읽고 실행합니다. --norc 옵션을 사용하여이를 방지 할 수 있습니다. --rcfile 파일 옵션은 bash가 ~ / .bashrc 대신 파일에서 명령을 읽고 실행하도록합니다.

위의 텍스트는 모든 것을 넣은 이유입니다 .bashrc. 그러나 로그인 쉘을 다룰 때 약간 다른 동작이 있습니다. 다시, 맨 페이지에서 인용 :

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

.profile로그인 쉘에 대해서는 읽지 만 .bashrc그렇지 않습니다. 모든 내용을 복제하는 .bashrc것은 좋지 않습니다. 따라서 .profile동작이 일관되게 유지 되도록 소스 를 만들어야합니다.

그러나 무조건 소스 .bashrc를 원하지는 않습니다 .profile. 자세한 내용은 의견 및 기타 답변을 참조하십시오.


4
-1, 에서 소스 하지 마십시오 . @ DanRabinowitz의 답변을 참조하십시오. .bashrc.profile
nyuszika7 시간

적어도 무조건 아닙니다.
nyuszika7 시간

[ -n "$BASH" -a -f ~/.bashrc ] && . ~/.bashrc감미로운 oneliner 일 것입니다 .profile.
John WH Smith

@ nyuszika7h, 왜 안돼? 모두 가 그렇게 제안하는 것 같습니다 .
Pacerier
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.