.bashrc와 .bash_profile의 차이점 의 차이 무엇입니까 .bashrc그리고 .bash_profile내가하는 일을

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



답변

전통적으로 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. 그것이 존재한다는 것을 잊어 버리십시오.


답변

짧은 기사에서

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

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

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

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


답변

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

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

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

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

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

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

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

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


답변

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 / 프로필 머리글에 대한 더 나은 의견

위의 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는 대화식으로 실행되지 않을 때 아무것도하지 않도록 설정되어 있습니다. 따라서이 두 파일은 대화식 스크립트 전용입니다.


답변

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


답변