왜 ~ / .bash_profile이 작동하지 않습니까?


35

Linux Mint를 사용하고 있습니다. 내 로그인 쉘 ( cat /etc/passwd | grep myUserName)은 bash입니다.

그래픽 데스크탑 환경을 시작하고 그 환경에서 터미널 에뮬레이터를 실행하면 .bash_profile소스가 아닌 것을 알 수 있습니다 (환경 환경 변수 export가 설정되어 있지 않음). 그러나 텍스트 콘솔 ( ctrl+ alt+ F1) 에서 로그인 하거나 bash -l터미널 에뮬레이터에서 수동으로 실행 하면 .bash_profile정상적으로 작동합니다.

.bash_profileX가 시작될 때 소스 export되어야하고 X에서 실행되는 터미널에서 모든 'vars를 사용할 수 있어야 한다고 생각하면 잘못 되었습니까?

추신 : 모든 것을 .bashrc넣고 소싱하는 .bash_profile것은 좋은 생각이 아닙니다 ( https://stackoverflow.com/questions/902946/ ) : 환경 관련 자료는 한 번만 제공해야합니다.

답변:


38

파일 ~/.bash_profile은 로그인 쉘일 때 bash에서 읽습니다. 텍스트 모드로 로그인하면 얻을 수있는 것입니다.

X로 로그인하면 시작 스크립트가에 의해 실행됩니다 /bin/sh. 우분투와 민트에서 /bin/sh입니다 대시 하지 배쉬. 대시와 bash는 모두 동일한 핵심 기능을 갖지만 빠르면서 작게하기 위해 이러한 핵심 기능에 대시를 사용하는 반면 bash는 더 많은 리소스를 요구하는 비용으로 많은 기능을 추가합니다. 추가 기능이 필요하지 않은 스크립트에는 대시를 사용하고 대화식 사용에는 bash를 사용하는 것이 일반적입니다 ( zsh 에는 많은 기능이 있습니다 ).

디스플레이 관리자의 대부분의 조합 읽고 데스크탑 환경 (사용자 이름과 암호를 입력 프로그램) ~/.profile에 로그인 스크립트에서 /etc/X11/Xsession, /usr/bin/lightdm-session, /etc/gdm/Xsession또는 중 적용합니다. 따라서 환경 변수 정의를에 넣으십시오 ~/.profile. 대시가 지원하는 구문 만 사용해야합니다.

그래서 어디에 두어야합니까?

  • 쉘이 대화식이면 good .bash_profile로드 .profile및로드 .bashrc.

    . ~/.profile
    if [[ $- == *i* ]]; then . ~/.bashrc; fi
  • .profile넣어 환경 변수의 정의 및 같은 다른 세션 설정, ulimit.

  • .bashrc별칭, 함수, 완료, 키 바인딩 (에없는 .inputrc) 과 같은 bash 대화식 설정을 입력하십시오 .

로그인 셸과 비 로그인 셸의 차이점을 참조하십시오 . 그리고 .bashrc의 대안 .


단일 답변에서 배운 많은 것들 :)
mtk

16

.bash_profilebash의 시작 구성 스크립트입니다. X를 소스로 지시하는 표준은 없습니다 .bash_profile.

당신이 생각하는 것은 오히려 .profile입니다. 원래는 bourne shell (sh)의 시작 구성 파일이었습니다. 오늘날 많은 배포판에서 데스크톱 환경을 소스로 설정했습니다 .profile. 이것은 또한 표준이 아니지만 관습 인 것 같습니다.

데비안 .profile은 그래픽 로그인 ( 2013 년 현재 위키 페이지) 에서 소스 를 사용 했지만 이제는 그렇지 않습니다 ( 2016 년 위키 페이지 ).

.xprofile그래픽 로그인시 아치 소스 ( 2013 년 기준 위키 페이지 )

우분투는 .profile( wiki page 2013 )을 사용하지 않는 것이 더 이상 낙담하지 않습니다 ( 2016 년 wiki page ).


다른 질문과 관련하여 내 ~ / .bash_profile이 왜 작동하지 않습니까? 이것이 예상되는 행동입니다.

간단히 말해서 행동은 다음과 같습니다.

  • bash는 대화식 로그인 쉘로 시작했습니다. ~/.profile
  • bash는 대화 형 비 로그인 셸로 시작했습니다. ~/.bashrc

자세한 내용은 askubuntu에서 비슷한 질문에 대한 내 대답을 참조하십시오 : https://askubuntu.com/questions/132276/configure-gnome-terminal-to-start-bash-as-a-login-shell-doesnt-read-bashrc / 132319 # 132319


1
이 중 일부는 맞지만 "항상 읽음 ~/.bashrc"은 좋지 않은 조언입니다. 대화식 쉘 에서만 읽을 수 .bashrc있습니다 . X에서 로그인 할 때 bash의 로그인 인스턴스가 없다는 것이 핵심 문제를 놓쳤습니다 (AntonioK를 포함한 대부분의 디스플레이 관리자 / 데스크탑 환경 조합에서).
Gilles 'SO- 악마 그만해'

의견을 보내 주셔서 감사합니다. 귀하의 불만 사항을 해결하기 위해 답변을 충분히 업데이트했으면합니다. "항상 읽음 .bashrc"에 대한 조언과 관련하여 항상 대화식 쉘을 의미했습니다. 나는 그 부분을 명확히했다. 더 이상 오도되지 않기를 바랍니다.
lesmana

2
" 우분투는 .profile( 링크 )를 사용하지 않는 것을 특히 권장하지 않습니다. " 수정되었습니다. ( /etc/profile스크립트를에 추가하기 위해 시스템 전체 할당에 대해서는 참고 하지 않는 것이 좋습니다 /etc/profile.d.) .profile이제 사용자 별 파일은 사용자 별 환경 변수를 설정하는 권장 방법 중 하나로 표시됩니다. "환경 변수 설정에 적합한 파일은" 시스템 전체가 아닌 특정 사용자는 ~ / .pam_environment~ / .profile 입니다. "
Eliah Kagan

데비안 않는 데비안 지정에 대한 링크 된 페이지 하지 읽을 ~/.profile그래픽 로그인과 ~/.xsessionrc대신 사용해야합니다.
karora

알아 주셔서 감사합니다. 위키 페이지가 업데이트되었습니다. 답변 할 당시의 버전에 연결했습니다.
lesmana

2

~ / .profile 파일을 다시로드 / 소스 할 때 몇 가지 문제가 발생합니다. [이것은 우분투 리눅스를 의미합니다-어떤 경우에는 명령의 세부 사항이 다를 수 있습니다]

  1. 터미널이나 스크립트에서 직접 실행합니까?
  2. 스크립트에서 이것을 어떻게 실행합니까?

광고. 1)

이것을 터미널에서 직접 실행하면 서브 쉘이 생성되지 않습니다. 따라서 두 가지 명령 중 하나를 사용할 수 있습니다.

source ~/.bash_profile

또는

. ~/.bash_profile

두 경우 모두 .profile 파일의 내용으로 환경을 업데이트합니다.

광고 2) 다음 중 하나를 호출하여 bash 스크립트를 시작할 수 있습니다

sh myscript.sh 

또는

. myscript.sh

첫 번째 경우 시스템의 환경 변수에 영향을 미치지 않는 서브 쉘을 작성하고 서브 쉘 프로세스에만 표시됩니다. 서브 쉘 명령을 완료 한 후에는 내보내기 등이 적용되지 않습니다. 이것은 일반적인 실수이며 많은 개발자가 많은 시간을 잃게 만듭니다.

스크립트에 적용된 변경 사항이 전역 환경에 영향을 미치려면 스크립트를 실행해야합니다.

.myscript.sh

명령.

스크립트가 서브 쉘에서 실행되지 않도록하기 위해이 기능을 사용할 수 있습니다. (또 다른 예는 우분투 쉘입니다)

#/bin/bash

preventSubshell(){
  if [[ $_ != $0 ]]
  then
    echo "Script is being sourced"
  else
    echo "Script is a subshell - please run the script by invoking . script.sh command";
    exit 1;
  fi
}

이것이 일반적인 오해를 해결하기를 바랍니다! : D 행운!


1

귀하의 질문에 당신은 https://stackoverflow.com/questions/902946/수락 된 답변이 처방 할 때 출처 를 밝히지 말 것을 권장 합니다

  • PATH 설정을 .profile 파일에 넣으십시오 (때로는 다른 쉘을 사용하기 때문에)
  • 내 Bash 별명과 함수를 .bashrc 파일에 넣으십시오.
  • 그런 다음이 [EDITED : snip code-comments]를 사용하십시오.

    .bash_profile:

    #!/bin/bash
    # echo "Loading ${HOME}/.bash_profile"
    source ~/.profile # Get the paths
    source ~/.bashrc  # get aliases

.profileLinux Mint 에서는 모든 것을 넣을 수 없었습니다. .bashrc잘 사용 했습니다.


0

간단한 해결책은 터미널을 로그인 터미널로 만드는 것입니다. 기본 프로필의 '타일 및 명령'아래에있는 Gnome 터미널의 경우 "로그인 명령으로 명령 실행"상자를 선택할 수 있습니다. 기사는 로그인 쉘과 그렇지 않은 로그인 쉘의 차이점을 설명합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.