bash_profile 또는 bashrc의 환경 변수?


36

이 질문을 발견했습니다. [블로그] : .bashrc와 .bash_profile의 차이점은 매우 유용하지만 가장 투표가 많은 답변을 본 후에 (나는 아주 좋은) 추가 질문이 있습니다. 가장 많이 투표 된 정답의 끝으로 나는 다음과 같이 진술을 봅니다.

여기에 환경 변수 정의를 ~ / .bashrc에 넣거나 터미널에서 항상 로그인 쉘을 시작하기위한 권장 사항이 표시 될 수 있습니다. 둘 다 나쁜 생각입니다.

  1. 왜 나쁜 생각입니까 (나는 싸우려고하지 않고 단지 이해하고 싶습니다)?

  2. 환경 변수를 설정하고 PATH (예 : JAVA_HOME)에 변수를 추가하여 내보내기 항목을 넣는 것이 가장 좋은 위치에 있습니까? 에 ~ / .bash_profile에 또는 ~ / .bashrc에 ?

  3. 질문 번호 2에 대한 답변이 ~ / .bash_profile 인 경우 두 가지 질문이 더 있습니다.

    3.1. ~ / .bashrc 아래에 무엇을 넣으 시겠습니까? 별명 만?

    3.2. 비 로그인 쉘에서 ~ / .bash_profile 이 "선택되지 않음" 이라고 생각합니다 . JAVA_HOME 항목 내보내기가 bash_profile에있는 경우 javac & java 명령 을 실행할 수 있습니까? PATH에서 찾을 수 있습니까? 이것이 일부 게시물과 포럼이 JAVA_HOME 및 ~ / .bashrc 설정을 제안하는 이유 입니까?

    미리 감사드립니다.

답변:


26

현대 시스템에서는 중요한 경우에 특히 흔하지는 않지만 발생합니다. (특히, 인라인 형태 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와 달리 사용자가 루트 셸에서 실행 되도록 전파합니다 . 이러한 환경을 사용하기 전에 아무런 문제가 없었습니다. 그것들을 사용하기 시작했을 때, 그들은 예기치 않은 설정 손실로 인해 어리둥절했습니다.~/.bashrcsudo$HOME~/.bashrc


1
나는 그것을 더 내면화하기 위해 더 많은 시간을 읽어야 할지도 모른다는 것을 이해한다고 생각하지만 다음과 같은 결론을 내립니다. 엔터프라이즈 환경에서 전역 쉘의 부작용없이 사용자 정의 쉘을보다 세밀하게 제어하려면 환경 변수를 ~ / .bash_profile 에 두는 것이 가장 좋습니다 . Ubuntu 또는 Linux Mint와 같은 개인 환경에서 PATH를 올바르게 설정하려면 ~ / .bashrc (또는 / etc / profile ) 에서 설정해야합니다 . 나 맞아?
Viriato

사용자이든 개발자이든 엔터프라이즈 환경과는 관련이 적습니다. "개발자"의 다소 다른 정의에 대한 Matlab 및 Cadence modules와 마찬가지로 시스템 rvm은 개발자 도구를 좋아 하며 개발자 도구입니다. 간단한 개발에는 필요하지 않지만 여러 버전의 Ruby, Perl 또는 Python에 대해 테스트해야 할 rvm경우 perlbrew, 및 virtualenv(각각) 똑같은 것을 원하면 모든 것을 똑바로 유지할 수 있습니다.
geekosaur

2

솔직히 말해서, 전문가의 말에도 불구하고 요즘에는 거의 차이가 없습니다.

이 문제는 요즘 로그인 쉘이 아닌 그래픽으로 로그인한다는 것입니다. 과거에는 유닉스 사용자들이 로그인 직후 서버에서 무슨 일이 일어나고 있는지에 대한 짧은 보고서를보고 싶었습니다. 명령 행으로 X를 시작합니다.이 보고서는 종종 생성하는 데 약간의 시간이 걸립니다 (예 : 10-20 초). 그리고 xterm을 시작할 때 같은 것을보고 싶지 않습니다. 따라서 차이.

요즘 나는 구별이 중요하지 않다고 생각합니다. 요즘 bash_profile에서 bashrc를 소스하면 아무도 당신을 비난 할 수 없다고 생각합니다.

이것은 macos x에는 적용되지 않습니다 (시작된 모든 terminal.app는 로그인 쉘임)


정확히 이해하지는 못하지만 직장에서 로그인 쉘 인 ssh를 통해 로그인 한 다음 bash_profile 및 bashrc가 소스 화되므로 해당 인스턴스에서 중요하지 않은 것으로 추측됩니다. 그러나 그래픽으로 로그인하면 (무엇을 의미합니까?) 내 개인 우분투에 로그인하는 것과 같이?
Viriato

@bubu의 대답에 동의하십시오- ~/.bash_profile소스 ~/.bashrc가 아닌 설정 은 깨진 작업에 어려움을 겪습니다. 그래픽 터미널 앱은 ~ / .bashrc를 소싱하고 모든 구성을 넣는 것이 더 간단하다는 것을 의미합니다.
RichVel

1

"그래픽 로그인"에 대해서는 사용하는 * 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를 사용하여 로그인 소스가됩니다.

두 가지 경우가 있습니다

  1. / bin / sh/ bin / bash에 연결되어 있지만 "POSIX / Bourne"모드에서 실행됩니다.
  2. / bin / sh/ bin / dash (debian / ubuntu)입니다. 가장 빠르지 만 기능이 적은 (ShellShock 지원;) )

따라서 / bin / sh 프로파일은 ~ / .bash_profile, ~ / .zprofile이 아니라 ~ / .profile입니다.

이 파일은 경로 및 환경 변수와 같은 "쉘 불가지론 적" 설정에 사용해야 합니다.

NO 로그인 전용 사용자 상호 작용을위한 실행 프로그램이 될 수 없지만 여기에해야한다 (메일 체크, 재산, 등등 ...)

~ /.* rc는 "대화식"세션에만 사용됩니다 (예 : 별칭).

대화식 로그인 쉘의 bash와 zsh에는 차이가 있습니다

bash는 .bash_profile 만 소스하고 zsh는 순서대로 제공합니다.

  1. ~ / .zprofile
  2. ~ / .zshrc
  3. ~ / zlogin (여기서 ~ / .zshrc에 정의 된 별명을 사용할 수 있습니다. "대화식"+ "로그인"쉘의 경우

~ / .bash_profile 을 수행하는 올바른 방법 은 다음과 같습니다.

.bashrc와 .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의 경우 두 가지 대안이 있습니다.

  1. 터미널이 로그인 쉘 역할을 할 때 ~ / .bash_profile 또는 ~ / .zprofile (또는 ~ / .zlogin) 에서 소스
  2. ~ / .bashrc 또는 ~ / zshrc에 스크립트 포함

즉, X 클라이언트 (예 : Emacs)는 그래픽이 아닌 터미널 쉘에서 시작해야합니다!

"만족할 수 없다 ..."


완전히 다른 이야기는 systemd를 사용 하여 서비스를 실행하는 것입니다. 가능한 대안은 다음과 같습니다. 래퍼 스크립트 작성, "서비스" 정의 파일에서 환경 정의, "env" 파일로 환경을 덤프하여 상위 셸에서 제공합니다. 상황이된다 난이도와 RVM / VIRTUALENV ...
hute37
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.