왜 사람들은 다른 길 대신 bashrc에서 bash_profile을 소스합니까?


7

대부분의 터미널 에뮬레이터는 기본적으로 로그인으로 로컬 세션을 실행하지 않으므로 bash_profile 대신 bashrc를로드합니다. 그렇다면 왜 대부분의 사람들은 모든 것을 bash_profile에 넣고 다른 방법보다는 bashrc 소스를 가지고 있습니까? "대부분의 사람들"은 지금까지 내가 본 대부분의 사람들을 의미합니다. 아마 내가 생각하는 것만 큼 넓지는 않을 것이다.

우리의 설정을 거기에 넣고 bashrc 소스 bash_profile을 사용하는 대신 리눅스 커뮤니티에서 bashrc에 모든 것을 넣고 bash_profile 소스를 사용하는 것이 더 의미 있고 더 일관성이 없습니까?

나는 iTerm2에 관해 좋은 소식을 들었고, 그런 것처럼 들린다. 그리고 다른 모든 터미널 에뮬레이터 (기본 OSX 터미널이 아닌)는 내가 로컬에서 실행될 때 bashrc를로드하게 될 것이다. 하나가 다른 소스를 제공하는 한 중요한 것은 아니지만 bash_profile을 선호하는 이유가 혼란 스럽습니다.

마이너 사이드 노트 : 나는 iTerm2에 대해 오해되었다. 두 개의 에뮬레이터에는 변경할 수있는 옵션이 있지만 Terminal.app와 마찬가지로 로그인 세션을 실행하는 것이 기본값입니다.

답변:


10

사람들은 bashrc에서 다른 방법 대신 bash_profile을 소스로 사용합니다. 현지 대회 때문에 .

모든 의견 내가 시작 파일을 어떻게 구성하는지 읽었습니다. bash 주로 현지 관례에 근거합니다. 현지 대회는 대개 비 로그인, 비대화 형 사례에 대해 많이 언급하지 않는다는 점에서 큰 그림을 언급하지 않습니다. 우스운 일은 내가 본 것인데, 나는 거의 아무도 언급하지 않는다고 본다. cron 하나의 시작 파일에 변수를 넣는 이유와 다른 하나의 시작 파일에 변수를 넣는 이유에 대해 이야기합니다. 사실, 나는 한마디의 말을 듣지 못했다 : " / bin / sh는 이유가 있습니다. Bash는 원래의 Bourne 쉘인 / bin / sh를 에뮬레이트합니다. "한 가지 사실, 나는 약간 빗나가 다.이 경우는 대화 형으로뿐만 아니라 대화 형이 아닌 비 로그인을 제공하는 사람들에게도 중요하다. 무인의 또는 배경 ) cron 최소한의 쉘 처리가 필요한 스크립트, 즉 백그라운드 처리는 색깔있는 프롬프트, 명령 내역 및 대체, 적절하게 정의 된 $ TERM 변수 등을 요구하지 않습니다.

더 나아가서는 cron, 내가 일반적으로 보는 것은 최소한의 검색 경로를 만들거나 정규화 된 프로그램을 호출하고 터미널에 연결되지 않은 출력을 처리하는 방법을 모르는 사람들입니다 (예 : 비대화 형, 비 로그인 bash 또는 sh 사례) cron 스크립트. 이는 대개 쉘 시작 시퀀스를 잘 이해하지 못했기 때문에 사용자가 로컬 파일에 이미 설정된 규칙과 일치하지 않거나 일관성이없는 방식으로 자체 시작 파일을 구현하게되기 때문입니다 /etc 시작 파일.

정교하게, 현지 조약에 의해 행해진 설치는 특정한 임명 및 포탄에서 계획된다 /etc 파일. UNIX 설치의 /etc 일반적인 파일의 일부로 호출되는 파일 bash 시동 순서에 따라, 그 중 하나는 자신들의 신생 기업을 설립 순서에 따라 설립해야한다. /etc 시작 파일.

Linux Documentation Project는 다음과 같이 말합니다.

/ etc / skel / 각 새 사용자의 기본 파일은이 파일에 저장됩니다.   예배 규칙서. 새 사용자가 추가 될 때마다이 뼈대 파일은   홈 디렉토리에 복사됩니다. 평균적인 시스템은 다음과 같습니다.   .alias, .bash_profile, .bashrc 및 .cshrc 파일. 다른 파일은 남았습니다.   시스템 관리자에게 문의하십시오.

비록 bash 매뉴얼에는 일반적으로 발견되는 이러한 파일이 언급되어 있지 않습니다. /etc/skel 디렉토리, 명시 적으로 SunOS, Solaris, RedHat, Ubuntu, HP-UX, umips, & amp; Ultrix에있다. /etc/skel 파일은 사용자의 쉘 ​​시작 파일을 패턴 화합니다. OSX는 분명히 그렇지 않습니다 - 지금 OSX 10.9.1을 사용하고 있습니다. 불행하게도, OSX는 컨벤션의 관점에서 설정해야 할 점에 대해서는별로 알려주지 않지만, OSX는 BSD 파생물이기 때문에 다른 BSD 파생물을 사용하고 직접 패턴을 만들었습니다 bash 그 후 시작 시퀀스, OSX 10.9.1에서 사용 된 현지 관습에 맞게 조정 /etc 시작 파일.

평행 한 논평에서 언급 된 중요한 점은 OSX의 경우, 모든 새로운 터미널을 대화 형 로그인 쉘로 시작하는 것이 관습입니다. 이것은 실제로 OSX에서 기본값입니다. 설치 사용자가 일관성있는 한이 규칙에 아무런 문제가 없습니다. OSX의 터미널에 대한 기본 동작은 터미널의 환경 설정을 다음과 같이 변경하여 다른 UNIX 배포의 셸 시작 규칙을 준수하도록 변경할 수 있습니다 , 특히 설정을 변경하십시오. Shells open with: 발급하다 /usr/bin/login -f -l whmcclos bash -i 명령:

enter image description here

모든 것을 배경이나 소개로 삼아 내 충고 그것이 가치가있는 것을 위해.

최선의 조언 :

UNIX 배포판의 관리자가 입력 한 파일을 검사하십시오. 다음 위치에서 시작하십시오 (있는 경우). 그 (것)들을 사용하는 것을 잊지 말라. ls -a 일부 파일은 점으로 시작하기 때문에 명령을 사용하십시오. 시작 중에 이러한 파일이 어떻게 사용되는지 확인하고 자신의 시작 파일이 파일과 상호 작용하는 방법을 확인하십시오.

/etc/bashrc
/etc/profile
/etc/skel/.bash_logout
/etc/skel/.bashrc
/etc/bash.bashrc
/etc/bash_completion

~을 보아라. bash 호출 및 시작 순서에 대한 설명서. 그것은 모두 잘 배치되어 있습니다.

OSX 10.9.1 설치시 어떻게했는지는 다른 유닉스 배포판과 다를 수 있지만, 아래에 나와있는 내용은 대부분의 UNIX 배포판에서 작동하지만 대부분의 UNIX 배포판에서는 작동하지만 다른 UNIX 배포판에서는 사용할 수 없습니다. 국제 대회를 가이드로 삼아 자신의 목적을 위해 아래 사항을 조정하십시오.

.윤곽

# ~/.profile: executed by the command interpreter for login shells.

# This file is not read by bash(1), if ~/.bash_profile or ~/.bash_login
# exists.  Note, however, that we will have a ~/.bash_profile and it
# will simply source this file as a matter of course.

# See /usr/share/doc/bash/examples/startup-files for examples.
# The files are located in the bash-doc package.

# From here on out, I basically set up my PATH, LD_LIBRARY_PATH, and anything else I'd like
# global to running programs and how those programs find their libraries.  This is shared by
# `cron`, so we really don't want interactive stuff, here.  Also, I setup my environments
# for brew, macports, and fink here, essentially with setting PATH, and invocation of those
# package initialization file as in:

# Brew and locally compiled stuff:
export PATH=/usr/local/bin:$PATH
export PATH=/usr/local/sbin:$PATH

# The following line puts gnu utilities without the prefix "g" in the path
# i.e. tar/gtar:
export PATH=$PATH:/usr/local/Cellar/coreutils/8.21/libexec/gnubin

# MacPorts shoves stuff in /opt, so to get at that stuff...
export PATH=/opt/local/bin:$PATH
export PATH=/opt/local/sbin:$PATH

# Set up for using Fink, which lives in /sw:
[ -e /sw/bin/init.sh ] && . /sw/bin/init.sh

# My stuff:
export PATH=~/perl:$PATH
export PATH=~/bin:$PATH
export PATH=.:$PATH

.bashrc

# ~/.bashrc: executed by bash(1) for non-login shells.
# see /usr/share/doc/bash/examples/startup-files (in the package bash-doc)
# for examples

# If not running interactively, don't do anything
[ -z "$PS1" ] && return

# From here on out, I put in things that are meaningful to interactive shells, like aliases,
# `shopt` invocations, HISTORY control, terminal characteristics, PROMPT, etc.

.bash_profile

# ~/.bash_profile: executed by the command interpreter for login shells.

# Because of this file's existence, neither ~/.bash_login nor ~/.profile
# will be sourced.

# See /usr/share/doc/bash/examples/startup-files for examples.
# The files are located in the bash-doc package.

# Because ~/.profile isn't invoked if this files exists,
# we must source ~/.profile to get its settings:
if [ -r ~/.profile ]; then . ~/.profile; fi

# The following sources ~/.bashrc in the interactive login case,
# because .bashrc isn't sourced for interactive login shells:
case "$-" in *i*) if [ -r ~/.bashrc ]; then . ~/.bashrc; fi;; esac

# I'm still trying to wrap my head about what to put here.  A suggestion
# would be to put all the `bash` prompt coloring sequence functions as
# described on http://brettterpstra.com/2009/11/17/my-new-favorite-bash-prompt/

그래서 저의 두 센트입니다. 내 예제는 시작 파일을 통해 제어 경로를 표시하고 특정 사이트의 규칙이 부과 할 수있는 것을 피하려고 시도했음을 기억하십시오.


최근 애플은 cron 맨 페이지에 메시지가 여전히 포함되어 있다고 말했지만, 애플은 론치 서비스가보다 융통성이 있다고 주장한다. 나는 cron 백그라운드 프로세스를 포기하지 않을 것이지만 시스템 관리자는 정말로 나를 떠나는 것을 싫어한다는 것을 안다. 내가 기술적으로 로그인하지 않은 상태에서 제어 스레드와 함께. 그립을 잡아라. 요세미티 어딘가에 들어가기위한 제어 스레드에 대해 말하면, ssh 포트 22는 실행 서비스에 포함되며, 실행 서비스는 ssh 시도를 가로 채고 포트 22로 라우팅합니다!
Billy McCloskey

내가 ssh에 대한 포트 22의 재 루틴을 가져 오는 이유는 조만간 rsa PGP 키와 같은 것을 얻을 것이며,이 주석을 apropos로 만들려면 필수적입니다 .bashrc와 .bash_profile이 올바르게 설정되어 있어야합니다. , 또는 ssh 유형의 고스트 로그인 시도, 특히 PGP 암호화가 사용되는 간단한 서비스는 비참하게 실패 할 것입니다! 따라서 .bashrc와 .bash_profile 등을 PGP와 ssh에서 도청하기 전에 설치해야합니다. 간단한 "ssh me @ myIP ls"가 실패한 경우 위의 .bash_profile 등의 파일이 올 바르고 제자리에 있거나 누군가로부터 복사되었는지 확인하십시오.
Billy McCloskey

나는 지난 3 개월 동안 셋업 된 3 개의 ssh 계정에 대해서만 마지막으로 주석을 달았으며 매번 올바른 단계를 밟았지만 시동 쉘 스크립트를 설정하고 나서 왜 내가 호출해야 하는지를 알아 내려고 노력했다. "ls"를 "/ bin / ls"로 지정하면 아무 것도 잘 동작하지 않습니다. 각 3 번, 나는 새로운 사용자에게 나의 쉘 시작 파일의 사본을주는 것을 잊었다. 그리고 제가 한 번, 매번 그들의 모든 문제가 사라졌습니다. 그래서? 됐어. 백그라운드 처리의 일종 - 서비스를위한 ssh 연결.
Billy McCloskey

좋은 대답! 한가지, 당신이 파일을 언급 한 것을 봅니다. /etc/bashrc 이외에 /etc/nash.bashrc. 나는 그것이 실수라고 가정하고 그것을 제거하려고했으나 나는 물을 것이라고 생각했다. 함께 배송되는 시스템이 있습니까? /etc/bashrc 파일? 나는 리눅스 세계에서 보지 못했다.
terdon

최근에 설치 한 Mac OS X 10.13.1에는 사전 설치되어 있습니다. /etc/bashrc 파일.
Billy McCloskey

4

왜 우리는 처음부터 모든 것을 bash_profile에 두는가?

.profile은 원래 / bin / sh에서 사용되었으며 .profile을 사용하면 이전 버전과의 호환성을 유지할 수 있습니다.

Mac을 사용하지 않는 한, 모든 것은 bash_profile에 저장되지 않습니다. 그것은 bashrc에 넣어진다.

그것은 더 이해가되지 않을 것이고 리눅스 공동체와의 일관성을 유지하여 bashrc에 모든 것을 넣고 bash_profile 소스를 얻을 수 있을까요?

시스템 정보를 시스템에 연결할 때로드되는 셸 (가동 시간, 업데이트가 필요한 패키지, CPU 시간 ...)에 시스템 정보를 저장하는 것이 일반적입니다. bashrc가 bash_profile을 소스했다면, 새로운 쉘을 열 때마다 모든 정보를 볼 수 있습니다.

유닉스에서 :

.bash_profile은 로그인 쉘에 의해로드됩니다.
.bashrc는 대화 형 셸에서로드됩니다.

Mac을 제외하고, 로그인 쉘을로드합니다. 모든 새로운 터미널 (대화 형 또는 비 대화 형)

추가 리소스

bashrc와 bash-profile의 차이점

환경 변수가 지정된 곳


@ spuder- 성명서 작성 시점이 확실하지 않습니다. Mac을 제외하고 모든 새로운 터미널 (대화 형 또는 비 호환)에 대한 로그인 셸을로드합니다. . 방금 iTerm2와 OSX Term.app에 새 터미널을 열었습니다. 둘 다 대화식 로그인 셸을 선물했습니다. 요점은?
Billy McCloskey

맥은 다른 유닉스와는 정반대 다. 우분투에서는 새 터미널을 열 때 bashrc가로드됩니다.
spuder

OSX는 bash 다르게 시작; 틀림없이 각 UNIX 배포판에는 관리자가 설정 한 컨벤션이 있으며 /etc/skel 및 기타 /etc 쉘 시작 파일은 배포판에 따라 달라지는 로컬 사용자에게 인프라를 부과합니다. 국제 대회가 옳은지에 대해 진술서를 작성하는 것은 어렵습니다. 나는 지방 대회와 함께 가고 그것을 확장 할 것입니다. 그만큼 bash 수동은 언제 명확하게 표시됩니까? $HOME/.bashrc 호출됩니다. OSX의 경우, & amp; 다른 모든 사람들 : 대화 형 & amp; 비 로그인. 쉘 시동을위한 상속 된 인프라는 결국 처리해야합니다.
Billy McCloskey

@ supder- 나는 OSX의 Terminal.app이 모든 것을 강제한다는 점에 동의 할 것이다. bash 쉘은 기본적으로 로그인 쉘로 연결됩니다. 우분투에서 사용 된 규칙을 따르기를 원하는 정보통 사용자는 OSX Terminal.app 환경 설정을 편집하고 껍데기는 다음과 같이 열립니다. ...에서 기본 로그인 쉘 ~로 명령 (전체 경로) : 필드가 /usr/bin/login -f -l userid bash -i. 이렇게하면 모든 Terminal.app을 우분투와 같은 대화 형 NON 로그인 쉘로 시작할 수있는 규칙이 변경됩니다. 그럼에도 불구하고, 그것은 Linux와는 다른 로컬 컨벤션이며, 함께 작업 할 수 있습니다.
Billy McCloskey

1

[...] bash_profile을 선호하는 것이 왜 표준이냐고 혼란 스럽습니다.

누가 그것이 표준이라고 말합니까? 그만큼 Bash 매뉴얼 주제에 대해 이렇게 말하고 있습니다.

따라서 일반적으로 ~ / .bash_profile에는

if [-f ~ / .bashrc]; 그럼. ~ / .bashrc; fi

로그인 특정 초기화 후 (또는 전에).


그 흥미 롭군요. 나는 대부분의 사람들이 그것을 다른 방식으로 구현한다는 인상을 받았지만 (bashrc bash_profile을 소싱하는 bashrc), 경험은 제한적이다.
ivan

리눅스에서 그렇습니다. 맥과는 정반대입니다.
spuder
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.