.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을보기 위해 이것을 다소 확장했습니다. 이렇게하면 bash 만 거기에 넣을 수 있습니다 (그래서 Bourne 쉘 등을 망치지 않고 .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 / PROFILE 책임자를위한 더 나은 의견
위의 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스크립트를 생략했습니다 . 이전 버전과의 호환성을 위해 bash를 /bin/sh대신 호출 /bin/bash하면 동작 이 변경됩니다. zsh 및 기타 쉘은 어떻습니까? 물론 다른 Linux 배포판은 다르게 작동합니다. 예를 들어 Debian과 Ubuntu는 비표준 버전의 bas h 와 함께 제공되며 Debian 전용 사용자 지정 기능이 있습니다. 특히 비정상적인 파일을 찾습니다 /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