.bashrc와 .bash_profile의 차이점


450

의 차이 무엇입니까 .bashrc그리고 .bash_profile내가하는 일을 사용해야은?



더 자세한 설명을 원한다면 .profile이 질문을 살펴보십시오 : superuser.com/questions/789448/…
Flimm

이 답변은 몇 가지 측면도 다루고 있습니다. stackoverflow.com/questions/415403/…
Sergey Voronezhskiy

답변:


518

전통적으로 Unix 시스템에 로그인하면 시스템이 하나의 프로그램을 시작합니다. 이 프로그램은 쉘, 즉 다른 프로그램을 시작하도록 설계된 프로그램입니다. 명령 행 쉘입니다. 이름을 입력하여 다른 프로그램을 시작하십시오. Bourne 쉘인 기본 쉘 ~/.profile은 로그인 쉘로 호출 될 때 부터 명령을 읽습니다 .

Bash는 Bourne과 같은 껍질입니다. ~/.bash_profile로그인 쉘로 호출 될 때 부터 명령을 읽고 , 해당 파일이 존재하지 않으면 ¹ ~/.profile대신 읽 습니다.

예를 들어 GUI 환경 내에서 터미널 에뮬레이터를 시작하여 언제든지 직접 쉘을 호출 할 수 있습니다. 쉘이 로그인 쉘이 아니면 읽지 않습니다 ~/.profile. 스크립트를 실행하지 않는 대화식 쉘로 bash를 시작하면 ( ~/.bashrc로그인 쉘로 호출 된 경우를 제외하고) ~/.bash_profile또는 만 읽습니다 ~/.profile.

따라서:

  • ~/.profile 로그인 할 때 시작하려는 프로그램 (그래픽 프로그램이 아닌 다른 파일로 이동) 및 환경 변수 정의와 같이 전체 세션에 적용되는 항목을 배치하는 장소입니다.

  • ~/.bashrc별명 및 함수 정의, 쉘 옵션 및 프롬프트 설정과 같이 bash 자체에만 적용되는 항목을 배치하는 장소입니다. (키 바인딩을 거기에 넣을 수도 있지만 bash의 경우 일반적으로로 이동합니다 ~/.inputrc.)

  • ~/.bash_profile대신에 사용할 수 ~/.profile있지만 다른 쉘이 아닌 bash 만 읽습니다. (초기화 파일이 여러 시스템에서 작동하고 로그인 쉘이 모든 시스템에서 bash가 아닌 경우에 이는 주로 문제가됩니다.) ~/.bashrc쉘이 대화식 인 경우 포함 할 논리적 위치 입니다. 나는 다음 내용을 권장합니다 ~/.bash_profile:

    if [ -r ~/.profile ]; then . ~/.profile; fi
    case "$-" in *i*) if [ -r ~/.bashrc ]; then . ~/.bashrc; fi;; esac

현대의 유니스에는에 관련된 추가 합병증이 ~/.profile있습니다. 그래픽 환경에 로그인 한 경우 (즉, 암호를 입력하는 프로그램이 그래픽 모드에서 실행중인 경우)라는 로그인 쉘이 자동으로 표시되지 않습니다 ~/.profile. 그래픽 로그인 프로그램, 나중에 실행하는 창 관리자 또는 데스크탑 환경 및 배포판에서 이러한 프로그램을 구성한 방법에 따라 ~/.profile읽거나 읽지 못할 수 있습니다. 그렇지 않은 경우 일반적으로 로그인 할 때 시작할 환경 변수 및 프로그램을 정의 할 수있는 다른 곳이 있지만 불행히도 표준 위치는 없습니다.

여기에 환경 변수 정의를 ~/.bashrc넣거나 터미널에서 항상 로그인 쉘을 시작 하기위한 권장 사항이 표시 될 수 있습니다 . 둘 다 나쁜 생각입니다. 이러한 아이디어 중 가장 일반적인 문제는 환경 변수가 아이콘을 통해 직접 시작된 프로그램이 아니라 터미널을 통해 시작된 프로그램에서만 설정된다는 것입니다.

¹ 완전성을 위해 요청에 따라 : .bash_profile존재하지 않는 경우 bash는로 .bash_login돌아 가기 전에 시도 합니다 .profile. 그것이 존재한다는 것을 잊어 버리십시오.


11
좋은 게시물 +1 "login graphic vs login shell"에 대한 섹션을 추가해 주셔서 감사합니다. ~ / .profile이 항상 graphic / shell에 대해 실행될 것이라고 생각하는 문제가있었습니다. 그러나 사용자가 로그인 할 때 실행되지 않습니다. 그래픽 로그인을 통해. 그 미스터리를 해결해 주셔서 감사합니다.
Trevor Boyd Smith

4
@Gilles : 모든 터미널에서 로그인 셸을 실행하는 것이 좋지 않은 이유를 예를 들어 자세히 설명해 주시겠습니까? 데스크탑 Linux에만 문제가 있습니까? (저는 OS X 터미널에서 매번 로그인 쉘을 실행하고 부작용을 눈치 채지 못했습니다 (보통 iTerm을 사용하지만).하지만 외부에서 신경 쓸 많은 환경 변수는 생각할 수 없습니다. 터미널 (어쩌면 HTTP_PROXY?)).
우상 파괴자

2
@Brandon 모든 터미널에서 로그인 셸을 실행하면 환경에서 제공하는 환경 변수보다 우선합니다. 일상적인 상황에서 그것을 벗어날 수는 있지만 터미널에 다른 변수를 설정하려고 할 때 (예를 들어 다른 버전의 프로그램을 시험해보기 위해) 조만간 물릴 것입니다. 로그인 쉘은 로컬 설정을 무시합니다.
Gilles 2016 년

4
~/.bash_profile대신을 사용할 수 ~/.profile있지만 ~/.bashrc셸이 대화 형인 경우 포함 해야합니다. 직교 문제이므로 오해의 소지가 있습니다. 아무리 당신이 사용하는 경우 ~/.bash_profile또는 ~/.profile당신은 포함해야 ~/.bashrc당신이 로그인 쉘에 효과가 거기에서 설정을 원하는 경우 사용하는 하나.
Piotr Dobrogost 2016 년

3
물론 @Gilles하지만, 문장이 질문에 공식화되는 방식은 다음을 포함 할 필요가 있음을 시사 ~/.bashrc선택과 함께 할 수있는 뭔가가 ~/.bash_profile대신 ~/.profile하는 사실이 아니다입니다. 누군가가 ~/.bashrc로그인 할 때 어떤 종류의 스크립트에 포함 되어 있다면 (여기서는 ~/.bash_profile또는 ~/.profile) ~/.bashrc로그인하지 않은 쉘에 적용되는 것과 같은 방식으로 로그인 쉘에 설정을 적용 하기를 원하기 때문 입니다.
Piotr Dobrogost 2016 년

53

짧은 기사에서

bash 매뉴얼 페이지에 따르면 .bash_profile은 로그인 쉘에 대해 실행되고 .bashrc는 대화 형 비 로그인 쉘에 대해 실행됩니다.

로그인 또는 비 로그인 셸이란 무엇입니까?

부팅시 물리적으로 머신에 앉아 있거나 ssh를 통해 원격으로 콘솔을 통해 로그인 (예 : 사용자 이름 및 비밀번호 입력)하면 .bash_profile이 실행되어 초기 명령 프롬프트 전에 설정합니다.

그러나 이미 컴퓨터에 로그인하여 Gnome 또는 KDE에서 새 터미널 창 (xterm)을 열면 창 명령 프롬프트 전에 .bashrc가 실행됩니다. .bashrc는 터미널에 / bin / bash를 입력하여 새 bash 인스턴스를 시작할 때도 실행됩니다.


12
약간의 업데이트 : 'Executed'는 아마도 약간 오해의 소지가있는 용어 일 수 있습니다. 스크립트, fork / exec yadda yadda로 실행되는 것처럼 들립니다. 현재 쉘의 컨텍스트에서 실행됩니다. 더 중요한 것은 .bashrc가 훨씬 자주 실행된다는 것입니다. 모든 bash 스크립트 실행에서 실행되며 .bash_profile이없는 경우에도 실행됩니다. 또한 xterm 설정 방법에 따라 .bash_profile
Rich Homolka를 제공

36

예전에는 의사 tty가 의사가 아니고 실제로 타이핑되고 유닉스가 모뎀에 의해 액세스 되었기 때문에 각 문자가 화면에 인쇄되는 것을 느리게 보았을 때 효율성이 가장 중요했습니다. 효율성을 높이기 위해 기본 로그인 창과 실제로 작동하는 다른 창에 대한 개념이있었습니다. 기본 창에서 새 메일에 대한 알림을 원하고 백그라운드에서 다른 프로그램을 실행할 수 있습니다.

이를 지원하기 위해 쉘은 .profile특히 '로그인 쉘'에서 파일을 소싱했습니다 . 이것은 세션 설정이 끝나면 특별하게 수행됩니다. Bash는 이것을 .profile보다 먼저 .bash_profile을 보도록 약간 확장했습니다. 로그인하지 않은 다른 쉘은 rc 파일, .bashrc (또는 .kshrc 등)를 소스로합니다.

이것은 지금 약간의 시대 착오입니다. GUI 창 관리자에 로그인 할 때만 큼 주 쉘에 로그인하지 않습니다. 기본 창은 다른 창과 다릅니다.

내 제안-이 차이점에 대해 걱정하지 마십시오. 유닉스를 사용하는 오래된 스타일을 기반으로합니다. 파일의 차이를 제거하십시오. .bash_profile의 전체 내용은 다음과 같아야합니다.

[ -f $HOME/.bashrc ] && . $HOME/.bashrc

그리고 실제로 설정하려는 모든 것을 .bashrc에 넣으십시오.

.bashrc는 대화식 및 비 대화식의 모든 셸에서 제공됩니다. 이 코드를 .bashrc 상단 근처에두면 비 대화식 쉘의 소싱을 단락시킬 수 있습니다.

[[ $- != *i* ]] && return


6
이것은 나쁜 생각 입니다. 내 대답을 참조하십시오 . 특히 환경 변수는 아이콘 또는 메뉴 또는 키보드 바로 가기로 직접 시작한 프로그램이 아니라 터미널을 통해 시작된 프로그램에서만 설정됩니다.
Gilles

4
@Gilles 나는 왜 당신이 이것을 주장하는지 이해하지 못한다. 함께 .$HOME/.bashrc리치 위 가리 켰을 때,의 설정은 .bashrc따라서 데스크톱 환경뿐만 아니라 로그인 쉘에서 사용할 수, 그리고 것입니다. 예를 들어, Fedora 시스템에서 gnome-session으로 시작 -$SHELL -c gnome-session되었으므로 .profile읽습니다.
Mikel

2
@PiotrDobrogost 아, 리치의 대답에는 또 다른 문제가 있습니다. bash에 의해 실행될 수 있고 (예 : 기본적으로 그래픽 로그인의 경우 Ubuntu에서) 해당 셸이 대화식이 아닐 수 있기 때문에 (예 : 그래픽 로그인의 경우) 일반적으로 포함 .bashrc하는 .profile것이 작동하지 않습니다 . .profile/bin/sh
Gilles

3
@Gilles re : ".profile에 .bashrc 포함"은 권장 된 것이 아닙니다 (실제로 반대로). 답변이 수정되었거나 (표시되지 않음) 의견이 말한 내용과 일치하지 않습니다.
마이클

2
일반적으로 +1이지만 "단락 ... 비 대화식 쉘의 경우"( ".bashrc의 상단 근처 : [[ $- != *i* ]] && return"); .bashrc비 대화식 쉘, 특히 발행시 env vars를 설정 ssh hostname {command}하여 원격 명령이 올바르게 실행되도록 (쉘이 비 대화식이지만) 일부를 실행하는 것을 좋아 합니다. 그러나 나중에 다른 설정 .bashrc은 무시해야합니다. 나는 일반적으로 TERM = dumb을 확인하거나 설정을 해제 한 다음 일찍 구제합니다.
마이클

18

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      |           |      |
+----------------+-----------+-----------+------+

여러 질문에 동일한 답변을 게시하는 대신 답변자의 특정 요구에 맞게 답변을 조정할 수있는 것이 좋습니다. 답변이 두 질문 모두에 대해 정확히 동일한 경우 단일 답변을 게시하고 다른 질문을 원본의 사본으로 닫기 위해 투표해야합니다.
Mokubai

1
@Mokubai 다른 질문은 이미이 질문의 사본으로 표시되었습니다.
Flimm

@ElipticalView는 : 세트가 아무것도 할에 의해, 당신은 라인을 언급하고 있습니다 : [ -z "$PS1" ] && return? 내 대답에있는 표는 스크립트 내용에 관계없이 Bash가 실행하는 스크립트 목록을 제공합니다. 스크립트 자체에 줄이 있으면 [ -z "$PS1" ] && return물론 적용됩니다.하지만 변경해야한다는 의미는 아닙니다. 표.
Flimm

5

/ ETC / 프로필 머리글에 대한 더 나은 의견

위의 Flimm의 위대한 대답을 바탕으로, 나는 데비안 / etc / profile의 머리에이 새로운 주석을 삽입 했습니다 .

# For BASH: Read down the appropriate column. Executes A, then B, then C, etc.
# The B1, B2, B3 means it executes only the first of those files found.  (A)
# or (B2) means it is normally sourced by (read by and included in) the
# primary file, in this case A or B2.
#
# +---------------------------------+-------+-----+------------+
# |                                 | Interactive | non-Inter. |
# +---------------------------------+-------+-----+------------+
# |                                 | login |    non-login     |
# +---------------------------------+-------+-----+------------+
# |                                 |       |     |            |
# |   ALL USERS:                    |       |     |            |
# +---------------------------------+-------+-----+------------+
# |BASH_ENV                         |       |     |     A      | not interactive or login
# |                                 |       |     |            |
# +---------------------------------+-------+-----+------------+
# |/etc/profile                     |   A   |     |            | set PATH & PS1, & call following:
# +---------------------------------+-------+-----+------------+
# |/etc/bash.bashrc                 |  (A)  |  A  |            | Better PS1 + command-not-found 
# +---------------------------------+-------+-----+------------+
# |/etc/profile.d/bash_completion.sh|  (A)  |     |            |
# +---------------------------------+-------+-----+------------+
# |/etc/profile.d/vte-2.91.sh       |  (A)  |     |            | Virt. Terminal Emulator
# |/etc/profile.d/vte.sh            |  (A)  |     |            |
# +---------------------------------+-------+-----+------------+
# |                                 |       |     |            |
# |   A SPECIFIC USER:              |       |     |            |
# +---------------------------------+-------+-----+------------+
# |~/.bash_profile    (bash only)   |   B1  |     |            | (doesn't currently exist) 
# +---------------------------------+-------+-----+------------+
# |~/.bash_login      (bash only)   |   B2  |     |            | (didn't exist) **
# +---------------------------------+-------+-----+------------+
# |~/.profile         (all shells)  |   B3  |     |            | (doesn't currently exist)
# +---------------------------------+-------+-----+------------+
# |~/.bashrc          (bash only)   |  (B2) |  B  |            | colorizes bash: su=red, other_users=green
# +---------------------------------+-------+-----+------------+
# |                                 |       |     |            |
# +---------------------------------+-------+-----+------------+
# |~/.bash_logout                   |    C  |     |            |
# +---------------------------------+-------+-----+------------+
#
# ** (sources !/.bashrc to colorize login, for when booting into non-gui)

그리고이 노트는 다른 설정 파일의 머리 부분에서 참조하십시오.

# TIP: SEE TABLE in /etc/profile of BASH SETUP FILES AND THEIR LOAD SEQUENCE

필자가 생각하기에 데비안의 / etc / profile은 기본적으로 /etc/bash.bashrc (/etc/bash.bashrc가 존재하는 경우)를 포함하고 있습니다. 따라서 로그인 스크립트는 / etc 파일을 모두 읽고, 비 로그인은 bash.bashrc 만 읽습니다.

또한 /etc/bash.bashrc는 대화식으로 실행되지 않을 때 아무것도하지 않도록 설정되어 있습니다. 따라서이 두 파일은 대화식 스크립트 전용입니다.


4

bash 자체의 구성 논리는 복잡하지 않으며이 페이지의 다른 답변, serverfault 및 많은 블로그에서 설명합니다. 그러나 문제 는 Linux 배포판이 bash로 만드는 것입니다 . 기본적으로 bash를 구성하는 복잡하고 다양한 방법을 의미합니다. http://mywiki.wooledge.org/DotFiles 는 이러한 단점 중 일부를 간략하게 언급합니다. 다음은 Fedora 29에 대한 하나의 샘플 추적입니다. 여기에는 어떤 파일이 어떤 파일을 다른 파일로 만드는지, 매우 간단한 시나리오의 순서가 나와 있습니다. ssh와 원격으로 연결 한 다음 다른 서브 쉘을 시작합니다.

ssh fedora29
 └─ -bash # login shell
      ├── /etc/profile
      |    ├─ /etc/profile.d/*.sh
      |    ├─ /etc/profile.d/sh.local
      |    └─ /etc/bashrc
      ├── ~/.bash_profile
      |    └─ ~/.bashrc
      |          └─ /etc/bashrc
      |
      |
      └─ $ bash  # non-login shell
            └─ ~/.bashrc
                 └─ /etc/bashrc
                       └─ /etc/profile.d/*.sh

Fedora의 가장 복잡한 논리는입니다 /etc/bashrc. 위에서 본 것처럼 /etc/bashrcbash 자체는 알지 못하는 파일이며 직접적으로는 아닙니다. Fedora의 /etc/bashrc테스트 결과 :

  • 로그인 쉘에 의해 제공되고 있습니다.
  • 대화식 쉘에서 제공하고 있습니다.
  • 이미 공급되었습니다

... 그리고 그에 따라 완전히 다른 일을합니다.

위의 그래프가 충분하지 않기 때문에 위의 그래프를 기억할 수 있다고 생각하는 경우 :이 그래프는 단지 하나의 시나리오 만 설명합니다. 비 대화 형 스크립트를 실행하거나 그래픽 세션을 시작할 때 약간 다른 일이 발생합니다. 나는 생략했다 ~/.profile. bash_completion스크립트를 생략했습니다 . 이전 버전과의 호환성을 위해 동작 /bin/sh/bin/bash변경하는 대신 bash를 호출하십시오 . zsh와 다른 쉘은 어떻습니까? 물론 다른 Linux 배포판은 다르게 작동합니다. 예를 들어 Debian과 Ubuntu는 비표준 버전의 h h 와 함께 제공되며 데비안 특정 사용자 정의 기능이 있습니다. 특히 특이한 파일을 찾습니다./etc/bash.bashrc. 단일 Linux 배포판을 사용하더라도 시간이 지남에 따라 진화 할 수 있습니다. 기다림 : macOS, FreeBSD, 심지어는 다루지 않았습니다 ... 마지막으로, 사용자가 자신들이 사용하는 시스템을 구성하는 훨씬 더 창의적인 방법을 사용하는 사용자를 생각합시다.

이 주제에 대한 끝없는 토론 흐름이 보여 주듯이, 그것은 잃어버린 원인입니다. 새 값을 추가하려는 경우 일부 "시험 및 오류"로 충분합니다. 하나의 (사용자) 파일에서 다른 (/ etc에) 이미 정의 된 것을 수정 하고 싶을 때 재미가 시작됩니다 . 그런 다음 휴대가 불가능한 솔루션을 엔지니어링하는 데 시간을 할애하십시오.

마지막 재미는 2019 년 6 월 현재 Clear Linux의 동일하고 간단한 시나리오에 대한 "소스 그래프"입니다.

ssh clearlinux
 └─ -bash # login shell
      ├── /usr/share/defaults/etc/profile
      |    ├─ /usr/share/defaults/etc/profile.d/*
      |    ├─ /etc/profile.d/*
      |    └─ /etc/profile
      ├── ~/.bash_profile
      |
      |
      └─  $ bash   # non-login shell
           ├─ /usr/share/defaults/etc/bash.bashrc
           |      ├─ /usr/share/defaults/etc/profile
           |      |    ├─ /usr/share/defaults/etc/profile.d/*
           |      |    ├─ /etc/profile.d/*
           |      |    └─ /etc/profile
           |      └─ /etc/profile
           └─ ~/.bashrc
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.