의 차이 무엇입니까 .bashrc
그리고 .bash_profile
내가하는 일을 사용해야은?
.profile
이 질문을 살펴보십시오 : superuser.com/questions/789448/…
의 차이 무엇입니까 .bashrc
그리고 .bash_profile
내가하는 일을 사용해야은?
.profile
이 질문을 살펴보십시오 : superuser.com/questions/789448/…
답변:
전통적으로 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_profile
대신을 사용할 수 ~/.profile
있지만 ~/.bashrc
셸이 대화 형인 경우 포함 해야합니다. 직교 문제이므로 오해의 소지가 있습니다. 아무리 당신이 사용하는 경우 ~/.bash_profile
또는 ~/.profile
당신은 포함해야 ~/.bashrc
당신이 로그인 쉘에 효과가 거기에서 설정을 원하는 경우 사용하는 하나.
~/.bashrc
선택과 함께 할 수있는 뭔가가 ~/.bash_profile
대신 ~/.profile
하는 사실이 아니다입니다. 누군가가 ~/.bashrc
로그인 할 때 어떤 종류의 스크립트에 포함 되어 있다면 (여기서는 ~/.bash_profile
또는 ~/.profile
) ~/.bashrc
로그인하지 않은 쉘에 적용되는 것과 같은 방식으로 로그인 쉘에 설정을 적용 하기를 원하기 때문 입니다.
이 짧은 기사에서
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
.$HOME/.bashrc
리치 위 가리 켰을 때,의 설정은 .bashrc
따라서 데스크톱 환경뿐만 아니라 로그인 쉘에서 사용할 수, 그리고 것입니다. 예를 들어, Fedora 시스템에서 gnome-session
으로 시작 -$SHELL -c gnome-session
되었으므로 .profile
읽습니다.
.bashrc
하는 .profile
것이 작동하지 않습니다 . .profile
/bin/sh
[[ $- != *i* ]] && return
"); .bashrc
비 대화식 쉘, 특히 발행시 env vars를 설정 ssh hostname {command}
하여 원격 명령이 올바르게 실행되도록 (쉘이 비 대화식이지만) 일부를 실행하는 것을 좋아 합니다. 그러나 나중에 다른 설정 .bashrc
은 무시해야합니다. 나는 일반적으로 TERM = dumb을 확인하거나 설정을 해제 한 다음 일찍 구제합니다.
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 | | |
+----------------+-----------+-----------+------+
[ -z "$PS1" ] && return
? 내 대답에있는 표는 스크립트 내용에 관계없이 Bash가 실행하는 스크립트 목록을 제공합니다. 스크립트 자체에 줄이 있으면 [ -z "$PS1" ] && return
물론 적용됩니다.하지만 변경해야한다는 의미는 아닙니다. 표.
/ 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/bashrc
bash 자체는 알지 못하는 파일이며 직접적으로는 아닙니다. 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