왜 우분투의 기본 ~ / .profile 소스 ~ / .bashrc입니까?


30

다음은 ~/.profile내 13.10과 함께 제공 되는 주식의 내용입니다 (설명 된 줄 제거).

if [ -n "$BASH_VERSION" ]; then
    if [ -f "$HOME/.bashrc" ]; then
    . "$HOME/.bashrc"
    fi
fi

if [ -d "$HOME/bin" ] ; then
    PATH="$HOME/bin:$PATH"
fi

이것은 데비안에서 물려 받았지만 Canonical은 왜 그것을 유지하기로 결정 했습니까? 내가 아는 한, 표준 * nix 방식이 아니며 이것이 발생하지 않은 다양한 시스템을 보았으므로 적절한 이유가 있다고 가정합니다. 이로 인해 사용자가 ~/.bashrc소싱 하지 않을 것으로 예상되는 로그인 쉘 (예 : 머신에 sshing 등)을 실행할 때 예기치 않은 동작이 발생할 수 있습니다 .

내가 생각할 수있는 유일한 이점은 사용자를 많은 시작 파일과 혼동하지 않고 .bashrc단독 으로 편집 하고 셸 유형에 관계없이 읽 도록 할 수 있다는 것입니다. 그러나 로그인과 대화식 쉘에 대해 서로 다른 설정을 사용하는 것이 유용하기 때문에 모호한 이점이 있습니다. 또한 로그인 셸은 그래픽 환경에서 실행되지 않는 경우가 많으며 해당 파일에서 설정 한 내용에 따라 오류 및 경고 및 문제 (오 마이!)가 발생할 수 있습니다.

왜 우분투가 이것을합니까? 내가 무엇을 놓치고 있습니까?


-n "$BASH_VERSION"bash 밖에서 사실일까요?
Elliott Frisch

@ElliottFrisch되지 않습니다. 내 질문은 .profilesource 가 왜 .bashrc모든 Linux 버전의 경우가 아니며 소스 의 근거가 무엇인지 궁금합니다.
terdon

데비안 업스트림 에서 그런 식으로 구현되는 것 같습니다 .
Elliott Frisch

@ElliottFrisch 예, 그렇지 않다고 생각하여 내 의견을 편집 할 때가되었습니다. 그럼에도 불구하고 내가 액세스 할 수있는 SuSe 시스템 (CentOS 시스템은 아니지만)의 경우가 아니며 내가 기억하는 한 다양한 시스템 (RH, Fedoras, 이전 Ubuntus)에서는 그렇지 않았습니다. 그래서 이유가 궁금합니다.
terdon

답변:


15

이것은 데비안에서 오는 업스트림 결정입니다. 이에 대한 이론적 근거는이 매우 훌륭한 위키 게시물에 설명되어 있으며, 다음 중 발췌 한 내용입니다. 요약은 "GUI와 비 GUI 로그인이 동일한 방식으로 작동하도록하기 위해"입니다.

xdm을 예로 들어 봅시다. pierre는 어느 날 휴가에서 돌아와서 시스템 관리자가 데비안 시스템에 xdm을 설치했음을 알게됩니다. 그는 제대로 로그인하고 xdm은 .xsession 파일을 읽고 fluxbox를 실행합니다. 그가 잘못된 로케일로 오류 메시지를받을 때까지 모든 것이 정상인 것 같습니다! .bash_profile에서 LANG 변수를 대체하고 xdm이 .bash_profile을 읽지 않으므로 LANG 변수는 이제 fr_CA 대신 en_US로 설정됩니다.

이 문제에 대한 순진한 해결책은 "xterm"을 시작하는 대신 "xterm -ls"를 시작하도록 창 관리자를 구성 할 수 있다는 것입니다. 이 플래그는 xterm에게 일반 쉘을 시작하는 대신 로그인 쉘을 시작해야 함을 알려줍니다. 이 설정에서 xterm은 / bin / bash를 생성하지만 인수 벡터에 "-/ bin / bash"(또는 "-bash")를 넣으므로 bash는 로그인 쉘처럼 작동합니다. 이것은 새 xterm을 열 때마다 / etc / profile 및 .bash_profile (내장 bash 동작)을 읽은 다음 .bashrc (.bash_profile이 그렇게하기 때문에)를 읽습니다. 이것은 처음에는 잘 작동하는 것처럼 보일 수 있습니다. 그의 도트 파일은 무겁지 않으므로 지연조차도 알지 못하지만 더 미묘한 문제가 있습니다. 또한 플럭스 박스 메뉴에서 직접 웹 브라우저를 시작합니다. 웹 브라우저는 플럭스 박스에서 LANG 변수를 상속받습니다. 이제는 잘못된 로케일로 설정됩니다. 따라서 그의 xterm은 훌륭하고 xterm에서 시작된 것은 괜찮을 수 있지만 웹 브라우저는 여전히 잘못된 로케일로 페이지를 제공합니다.

그렇다면이 문제에 대한 가장 좋은 해결책은 무엇입니까? 실제로 보편적 인 것이 아닙니다. 더 좋은 방법은 .xsession 파일을 다음과 같이 수정하는 것입니다.

[ -r /etc/profile ] && source /etc/profile
[ -r ~/.bash_profile ] && source ~/.bash_profile
xmodmap -e 'keysym Super_R = Multi_key'
xterm &
exec fluxbox

이로 인해 xmodmap 또는 xterm을 실행하거나 창 관리자를 "실행"하기 전에 .xsession 스크립트를 해석하는 쉘이 / etc / profile 및 .bash_profile에서 읽고 읽을 수있는 경우 읽을 수 있습니다. 그러나이 방법에는 한 가지 잠재적 인 단점이 있습니다. xdm에서 .xsession을 읽는 쉘은 제어 터미널없이 실행됩니다. / etc / profile 또는 .bash_profile이 터미널이 존재한다고 가정하는 명령 (예 : "포춘"또는 "stty")을 사용하면 해당 명령이 실패 할 수 있습니다. 이것이 xdm이 기본적으로 해당 파일을 읽지 않는 주요 이유입니다. 이 방법을 사용하려면 터미널이 없을 때 "도트 파일"의 모든 명령을 안전하게 실행해야합니다.


여전히 좋은 생각이 아니라고 생각합니다. 가장 이상적인 방법은 디스플레이 관리자가 전역 프로필 (확인)과 사용자 셸 .profile을 제공하도록하는 것입니다. 이제 일부 변수에서 경로가 중복 된 이유를 알고 있습니다.
Rmano

2

이것은 Ubuntu의 표준 동작 ~/.bashrc이며 사용자 수준의 대화식 셸 시작 파일입니다. 터미널을 열면 기본적으로 비 로그인 대화식 쉘 을 시작하여 ~/.bashrc내용 을 읽고 ~/.bashrc현재 쉘 환경으로 내 보냅니다. 현재 쉘에서 모든 사용자 정의 쉘 변수함수 를 얻는 데 도움이됩니다 . 또한 당신은 이런 줄을 찾을 수 있습니다

if [ -f ~/.bash_aliases ]; then
    . ~/.bash_aliases
fi

현재 쉘 환경에서 사용자 정의 별명 을 확보 합니다.

이것은 좋은 사용자 경험을 제공하기 위해 중요합니다. 예를 하나 들어 프록시 자격 증명에 저장할 수 .bashrc는 터미널 응용 프로그램을 전혀 공급하지 얻을하지 않는 한, ( 즉은 , ping, wget, curl, lynx등)가 제대로 작동합니다. 또는 터미널을 열 때마다 프록시 자격 증명을 제공해야합니다.

Ubuntu의 기본값 .bashrc에는 사용자 친화적 인 별명 ( 색상 출력용 lsgrep인쇄용)과 다양한 쉘 변수에 대한 많은 새로운 정의가 포함되어있어 사용자 경험을 향상시킵니다.

그러나 ssh login 또는 가상 콘솔 에 로그인하는 경우 기본적으로 대화식 로그인 쉘이 제공됩니다. 쉘 시작 파일은 ~/.profile입니다. 따라서 출처 ~/.bashrc를 밝히지 않으면에 유용한 설정이 모두 누락됩니다 .bashrc. 그래서 우분투의 기본 ~/.profile소스~/.bashrc

피해야 할 경우

  • 에서 소스를 제공 할 때 동시에 ~/.profile양식을 소스 로 사용 해서는 안됩니다 . 그것은 무한한 상황 루프를 만들며 결과적으로 +를 누르지 않으면 터미널 프롬프트가 일시 중단됩니다 . 그런 상황에서 당신이 당신의 라인을 넣어~/.bashrc~/.bashrc~/.profileCtrlC~/.bashrc
세트 -x

그러면 터미널을 열 때 파일 디스크립터가 중지되고 있음을 알 수 있습니다.


감사합니다. 이것은 모두 진실되고 유용한 정보입니다. 그것은 단지 내 질문을 다루지 않습니다. 로그인과 비 로그인 쉘의 차이점에 익숙합니다. 내 질문은 왜 우분투 시스템에서 .profile소싱 .bashrc입니까? SuSe Enterprise 10은 그렇게하지 않았으며, 내가 사용한 Fedora 버전 중 어느 것도 사용하지 않았지만 몇 년 전에는 잘못되었을 수 있습니다. CentOS 5.8은 이상하게 충분합니다. 어쨌든 내 요점이 보이나요? 이것은 디자인 선택이며 왜 만들어 졌는지 궁금합니다.
terdon

나는 당신이 지명 한 다른 리눅스 배포판을 엄격하게 사용하지 않았습니다. .bashrc또는에 정의 된 ssh 세션의 별칭 명령과 같은 상황을 처리하는 방법을 알려주십시오 .bash_aliases. 예를 들어 나는 별칭을 가지고 lsls --color=auto내에서 .bashrc내가 .bashrc내에서 공급되었다 .profile. 여기서는 ssh에서도 별칭을 사용할 수 있습니다. 또는 ssh 세션에서 프록시를 사용할 수 있습니다. 내 소스하지 않으면 .bashrc에서 .profile나는 그 기능을 잃게. 나는 그것이 더 나은 사용자 경험에 관한 것이라고 생각합니다.
souravc

그들은 그렇지 않습니다, 그 별칭은 작동하지 않습니다. 그리고 그렇습니다, 소싱은 .bashrc그것을 고 칩니다 . 그러나 그것은 또한 문제, 나는 내가 할 때 이상한 메시지를 받고 보관이 동작 한 시스템에 사용되는 처음 기억의 원인 ssh이 내가 사용 된 원인에 보내고을 xset b off내에서 .bashrc터미널 종을 비활성화하는 데 사용되는하지만 그것은 그래서 X 시스템에 오류 메시지를 제공했습니다. .bashrc로그인 쉘을 실행할 때 읽히지 않을 것이라고 생각한 이후로 무슨 일이 있었는지 알아 내기 위해 나이가 들었 습니다. 이것에 대해 "공식적인"진술이 있는지 궁금합니다.
terdon

동의합니다. 나는 또한 일찍 문제에 직면 했다 . 그러나 명심하고 몇 가지 특별한 경우를 피하면 대부분 도움이되고 사용자 친화적입니다. :)
souravc

네, 여기에는 유효한 이유가 있습니다. 나는 Canonical이이 업스트림 결정을 유지 한 이유를 제시했는지 궁금했습니다.
terdon
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.