~/.bash_profile이 작동하지 않는 이유는 무엇입니까?

~/.bash_profile이 작동하지 않는 이유는 무엇입니까?

저는 리눅스 민트를 사용하고 있습니다. 내 로그인 쉘( cat /etc/passwd | grep myUserName)은 bash입니다.

.bash_profile그래픽 데스크탑 환경을 시작하고 터미널 에뮬레이터를 실행한 후 소스가 없는 것을 볼 수 있습니다 (편집된 환경 변수가 export설정되지 않은 곳). 그러나 ctrl텍스트 콘솔( ++ )에서 로그인하거나 터미널 에뮬레이터에서 수동으로 실행하면 alt제대로 작동합니다.F1bash -l.bash_profile

.bash_profileX가 시작될 때 가져와야 하고 모든 export변수가 터미널에서 사용 가능하고 X에서 실행되어야 한다고 생각하는 것이 틀렸습니까?

PS는 모든 것을 넣고 .bashrc소스를 제공합니다..bash_profile 이건 좋은 생각이 아니야: 환경용품은 한 번만 구매하세요.

답변1

bash가 로그인 쉘일 때 ~/.bash_profilebash는 이 파일을 읽습니다 . 텍스트 모드로 로그인하면 나타나는 내용입니다.

X에서 로그인하면 시작 스크립트는 /bin/sh.Ubuntu 및 Mint 로 구성 /bin/sh됩니다 .스프린트, 세게 때리는 대신. Dash와 bash는 모두 동일한 핵심 기능을 가지고 있지만 dash는 빠르고 작기 때문에 핵심 기능을 고수하는 반면, bash는 더 많은 리소스를 필요로 하는 대신 많은 기능을 추가합니다. 일반적으로 대시는 추가 기능이 필요하지 않은 스크립트에 사용되고 bash는 대화식 사용에 사용됩니다(물론다루기 힘든 더 좋은 기능이 많아요).

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

그럼 어디에 무엇을 넣어야 할까요?

  • 로드 가 양호 하며 .bash_profile쉘이 대화형인 경우 .profile로드됩니다 ..bashrc

    . ~/.profile
    if [[ $- == *i* ]]; then . ~/.bashrc; fi
    
  • .profile환경 변수 정의 및 기타 세션 설정(예: )을 배치합니다 ulimit.

  • 에서는 별칭, 함수, 완성, 키 바인딩( 에는 없음 ) .bashrc등과 같은 bash 상호 작용 설정을 배치합니다 ..inputrc

당신은 또한 볼 수 있습니다로그인 쉘과 비로그인 쉘의 차이점은 무엇입니까?그리고.bashrc의 대안.

답변2

.bash_profileBash의 시작 구성 스크립트입니다. .bash_profileX 의 출처를 규정하는 표준은 없습니다 .

당신이 생각하는 것은 .profile. 원래는 Bourne Shell(sh)의 시작 구성 파일이었습니다. 요즘 많은 배포판은 데스크톱 환경을 소스 코드로 설정합니다 .profile. 이것도 표준은 아니지만 관례인 것 같습니다.

데비안은 소스 코드를 사용하여 .profile그래픽 로그인을 통해 소스 코드를 얻습니다(2013년 기준 위키 페이지)지금은 아니야(2016년 기준 위키 페이지).

아치 소스 .xprofile(2013년 기준 위키 페이지).

우분투는 .profile(2013년 기준 위키 페이지) 이제 더 이상 답답하지 않습니다(2016년 기준 위키 페이지).


다른 질문에 관해서 : 내 ~/.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

답변3

/source ~/.profile 파일을 다시 로드하려고 할 때 몇 가지 문제가 발생합니다. [Ubuntu linux를 의미하며, 경우에 따라 명령의 세부 내용이 다를 수 있습니다.]

  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 행운을 빕니다!

답변4

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

관련 정보