이 질문을 발견했습니다. [블로그] : .bashrc와 .bash_profile의 차이점은 매우 유용하지만 가장 투표가 많은 답변을 본 후에 (나는 아주 좋은) 추가 질문이 있습니다. 가장 많이 투표 된 정답의 끝으로 나는 다음과 같이 진술을 봅니다.
여기에 환경 변수 정의를 ~ / .bashrc에 넣거나 터미널에서 항상 로그인 쉘을 시작하기위한 권장 사항이 표시 될 수 있습니다. 둘 다 나쁜 생각입니다.
-
왜 나쁜 생각입니까 (나는 싸우려고하지 않고 단지 이해하고 싶습니다)?
-
환경 변수를 설정하고 PATH (예 : JAVA_HOME)에 변수를 추가하여 내보내기 항목을 넣는 것이 가장 좋은 위치에 있습니까? 에 ~ / .bash_profile에 또는 ~ / .bashrc에 ?
-
질문 번호 2에 대한 답변이 ~ / .bash_profile 인 경우 두 가지 질문이 더 있습니다.
3.1. ~ / .bashrc 아래에 무엇을 넣으 시겠습니까? 별명 만?
3.2. 비 로그인 쉘에서 ~ / .bash_profile 이 “선택되지 않음” 이라고 생각합니다 . JAVA_HOME 항목 내보내기가 bash_profile에있는 경우 javac & java 명령 을 실행할 수 있습니까? PATH에서 찾을 수 있습니까? 이것이 일부 게시물과 포럼이 JAVA_HOME 및 ~ / .bashrc 설정을 제안하는 이유 입니까?
미리 감사드립니다.
답변
현대 시스템에서는 중요한 경우에 특히 흔하지는 않지만 발생합니다. (특히, 인라인 형태 vim
와 같은 쉘 조작을 사용하는 경우 ):r !command
!<motion>command
~ / .bashrc 아래에 무엇을 넣으시겠습니까? 별명 만?
~/.bashrc
서브 쉘이 자동으로 상속하지 않는 것을 넣습니다 . 이것은 종종 별칭과 함수를 의미하지만, 때로는 쉘 외부에서 보이지 않기를 원하는 변수 설정이 있습니다 (매우 드 rare니다). 어쨌든 그것들을 내 보내야한다고 주장 할 수는 있지만 다양한 실험 시도가 환경 내에서 숨기려고 할 때 호환성 문제가 발생하여 대부분 포기되었습니다.
환경 변수를 설정하고 PATH (예 : JAVA_HOME)에 변수를 추가하여 내보내기 항목을 넣는 것이 가장 좋은 위치에 있습니까? ~ / .bash_profile 또는 ~ / .bashrc에 있습니까?
환경 설정을 ~/.bash_profile
초기 설정으로 지정합니다. 때로는이를 재정의하기를 원할 수도 있습니다 (종종 Matlab 또는 Cadence와 같은 복잡한 환경에서 수행됨). 환경 설정을 입력하면 ~/.bashrc
해당 환경 내에서 실행되는 셸은 환경의 사용자 정의를 잃어 버리고 결과적으로 제대로 작동하지 않을 수 있습니다. 이는 모듈 , virtualenv , rvm 등과 같은 패키지를 사용하여 여러 개발 환경을 관리 하는 경우에도 적용됩니다 . 설정을 지정 ~/.bashrc
하면 편집기 내에서 원하는 환경을 실행할 수 없지만 대신 시스템 기본값으로 설정됩니다.
비 로그인 쉘에서 ~ / .bash_profile이 “선택되지 않음”이라고 생각합니다.
이것은 맞습니다. 당신은 일반적으로 초기 쉘은 로그인 쉘과에 하나에서 시작 어떤 조개되고 싶어 하지 로그인 할 수 포탄입니다. 초기 셸이 로그인 셸이 아닌 경우 기본 PATH
또는 다양한 다른 설정 ( JAVA_HOME
예 : 포함 )이 없습니다.
디스플레이 관리자 (대부분의 그래픽 로그인)에서 시작된 대부분의 데스크탑 환경은 전체 데스크탑에 대한 로그인 환경을 설정하지 않으므로 터미널에서 초기 쉘을 로그인 쉘로 실행해야합니다. 이로 인해 여러 가지 문제가 발생합니다 ( PATH
예 : 패널에서 실행되는 프로그램에서 사용할 수있는 프로그램 등은 패널이 터미널이 아니고 실행되지 않았기 때문에 올바르게 설정되지 않은 경우 ~/.bash_profile
). 그러나 항상 가능한 것은 아니라는 점에서 합리적인 타협입니다. ~/.bash_profile
내용에 따라 디스플레이 관리자가 시작한 세션이 시작될 때 비 대화식 환경에서 제대로 실행 됩니다. 때때로 환경 설정을하는 것이 좋습니다~/.bashrc
대신 로그인 쉘을 구성하는 대신; 상술 한 바와 같이,만큼이 작품 당신은 환경을 재정의 할 필요가 없기 때문에, 당신은 한 번 이상한 파손을 야기 할 그렇게 할 필요가 있습니다.
나는 최근에 OS X에서 이와 같은 문제를 진단하는 데 도움을주었습니다. ~/.bashrc
나중에 설정을 한 사용자가 나중에 perlbrew를 사용하기 시작 rvm
하고 이상한 행동을 보았습니다. 두 사람에 의해 설정된 환경은 내부 편집자에 의해 “실행 취소”되었기 때문에 (OS X에서) Linux와 달리 사용자가 루트 셸에서 실행 되도록 전파합니다 . 이러한 환경을 사용하기 전에 아무런 문제가 없었습니다. 그것들을 사용하기 시작했을 때, 그들은 예기치 않은 설정 손실로 인해 어리둥절했습니다.~/.bashrc
sudo
$HOME
~/.bashrc
답변
솔직히 말해서, 전문가의 말에도 불구하고 요즘에는 거의 차이가 없습니다.
이 문제는 요즘 로그인 쉘이 아닌 그래픽으로 로그인한다는 것입니다. 과거에는 유닉스 사용자들이 로그인 직후 서버에서 무슨 일이 일어나고 있는지에 대한 짧은 보고서를보고 싶었습니다. 명령 행으로 X를 시작합니다.이 보고서는 종종 생성하는 데 약간의 시간이 걸립니다 (예 : 10-20 초). 그리고 xterm을 시작할 때 같은 것을보고 싶지 않습니다. 따라서 차이.
요즘 나는 구별이 중요하지 않다고 생각합니다. 요즘 bash_profile에서 bashrc를 소스하면 아무도 당신을 비난 할 수 없다고 생각합니다.
이것은 macos x에는 적용되지 않습니다 (시작된 모든 terminal.app는 로그인 쉘임)
답변
“그래픽 로그인”에 대해서는 사용하는 * DM에 따라 다릅니다.
GDM (Gnome 3.18)으로 나는 이것을 가지고있다 :
/ etc / gdm / Xsession
#!/bin/sh <= *important*
...
# First read /etc/profile and .profile
test -f /etc/profile && . /etc/profile
test -f "$HOME/.profile" && . "$HOME/.profile"
# Second read /etc/xprofile and .xprofile for X specific setup
test -f /etc/xprofile && . /etc/xprofile
test -f "$HOME/.xprofile" && . "$HOME/.xprofile"
따라서 ~ / .profile 은 / bin / bash가 아닌 / bin / sh를 사용하여 로그인 소스가됩니다.
두 가지 경우가 있습니다
- / bin / sh 는 / bin / bash에 연결되어 있지만 “POSIX / Bourne”모드에서 실행됩니다.
- / bin / sh 는 / bin / dash (debian / ubuntu)입니다. 가장 빠르지 만 기능이 적은 (ShellShock 지원;) )
따라서 / bin / sh 프로파일은 ~ / .bash_profile, ~ / .zprofile이 아니라 ~ / .profile입니다.
이 파일은 경로 및 환경 변수와 같은 “쉘 불가지론 적” 설정에 사용해야 합니다.
NO 로그인 전용 사용자 상호 작용을위한 실행 프로그램이 될 수 없지만 여기에해야한다 (메일 체크, 재산, 등등 …)
~ /.* rc는 “대화식”세션에만 사용됩니다 (예 : 별칭).
대화식 로그인 쉘의 bash와 zsh에는 차이가 있습니다
bash는 .bash_profile 만 소스하고 zsh는 순서대로 제공합니다.
- ~ / .zprofile
- ~ / .zshrc
- ~ / zlogin (여기서 ~ / .zshrc에 정의 된 별명을 사용할 수 있습니다. “대화식”+ “로그인”쉘의 경우
~ / .bash_profile 을 수행하는 올바른 방법 은 다음과 같습니다.
if [ -r ~/.profile ]; then . ~/.profile; fi
case "$-" in *i*) if [ -r ~/.bashrc ]; then . ~/.bashrc; fi;; esac
테스트 (및 프로파일 링)를 사용하려면 다음을 사용하십시오.
~ / .bash_profile :
#!/bin/bash
# ------------------------------------------------
export _DOT_BASH_PROFILE_0=`date --rfc-3339=ns`
# ------------------------------------------------
if [ -f ~/.profile ] ; then
. ~/.profile
fi
case "$-" in *i*) if [ -r ~/.bashrc ]; then . ~/.bashrc; fi;; esac
# ------------------------------------------------
export _DOT_BASH_PROFILE_1=`date --rfc-3339=ns`
# ------------------------------------------------
~ / .zprofile :
#!/bin/zsh
# ------------------------------------------------
export _DOT_ZSH_PROFILE_0=`date --rfc-3339=ns`
# ------------------------------------------------
if [ -f ~/.profile ] ; then
. ~/.profile
fi
# no need to source, zsh already handle ~/.zshrc
###case "$-" in *i*) if [ -r ~/.zshrc ]; then . ~/.zshrc; fi;; esac
# ------------------------------------------------
export _DOT_ZSH_PROFILE_1=`date --rfc-3339=ns`
# ------------------------------------------------
그런 다음 테스트하십시오.
chsh -s /bin/bash
ssh localhost
env
exit
ssh localhost env
ssh -t localhost bash -i -c env
chsh -s /bin/zsh
ssh localhost
env
exit
ssh localhost env
ssh -t localhost bash -i -c env
따라서 RVM / virtualenv는 ~ / .profile, IMHO로 이동해야합니다.
그러나이 작동하지 않음 , 때로는 …
예를 들어 virualenvwrapper 는 Xsession을 실행하는 쉘이 “원본”bash (BASH_VERSION 내보내기) 인 경우에만 작동합니다.
당신은에있는 경우 대시 시스템, 환경 변수 및 경로 설정 작동하지만 virualenvwrapper 스크립트는 POSIX를 준수하지 않기 때문에 함수 정의가없는 일을.
스크립트는 오류를 발생시키지 않지만 “workon” 정의 없이 종료 됩니다.
따라서 ~ / .profile 에서 환경을 설정할 수 있습니다 . X에서 직접 시작한 클라이언트에서 올바른 파이썬 실행을 활성화하기 만하면됩니다.
export VIRTUAL_ENV="/home/mike/var/virtualenvs/myvirtualenv"
export PATH="$VIRTUAL_ENV/bin:$PATH"
unset PYTHON_HOME
https://gist.github.com/datagrok/2199506
https://www.bountysource.com/issues/9061991-setting-up-your-computer-virtualenvwrapper-linux-all
그러나 virualenvwrapper의 경우 두 가지 대안이 있습니다.
- 터미널이 로그인 쉘 역할을 할 때 ~ / .bash_profile 또는 ~ / .zprofile (또는 ~ / .zlogin) 에서 소스
- ~ / .bashrc 또는 ~ / zshrc에 스크립트 포함
즉, X 클라이언트 (예 : Emacs)는 그래픽이 아닌 터미널 쉘에서 시작해야합니다!
“만족할 수 없다 …”