.bashrc, .profile, .bash_profile 등 중에서 선택

.bashrc, .profile, .bash_profile 등 중에서 선택

당황스러운 일이지만 수년 동안 POSIX 시스템을 풀타임으로 사용한 후에도 쉘 사용자 정의가 , 또는 다른 곳에 들어가야 하는지 파악하는 데 여전히 어려움을 겪고 .bashrc있습니다 .profile. ..pam_environment

예, 저는 문서를 통해 수수께끼를 풀고 각 파일이 로드되거나 로드되지 않는 시기를 알아내는 방법을 알고 있습니다. 내가 궁금한 것은 주어진 유형의 사용자 정의를 어떤 파일에 넣을지 결정하는 방법에 대한 포괄적인 지침을 모두 모아 놓은 사람이 있는지입니다.

답변1

요약:

  • ~/.bash_profile매우 간단해야 하며 로드 .profile하고 .bashrc(순서대로)

  • ~/.profilePATH환경 변수( 및 친구) 와 같이 bash와 특별히 관련되지 않은 항목이 있습니다.

  • ~/.bashrc대화형 명령줄에 원하는 모든 것이 있습니다. EDITOR내가 사용할 명령 프롬프트, 변수, bash 별칭

기타 참고사항:

  • 그래픽 애플리케이션이나 sh(또는 로 호출된 bash)에서 사용할 수 있어야 하는 모든 항목은 sh반드시~/.profile

  • ~/.bashrc아무것도 출력하면 안 된다

  • 로그인 쉘에서만 사용할 수 있어야 하는 모든 항목은 로그인 쉘에 들어가야 합니다.~/.profile

  • 존재하지 않는지 확인하세요 ~/.bash_login.

답변2

지난 몇 년간 낭비할 ​​시간이 너무 많아서가지다이것을 10분 넘게 조사했습니다. 이것이 최선의 레이아웃인지는 잘 모르겠습니다. 거의 모든 경우에 올바르게 작동하는 레이아웃일 뿐입니다.

요구 사항:

  • ~/.profile모든 /bin/sh와 호환되어야 합니다. 여기에는 bash, dash, ksh 등 배포판에서 사용하도록 선택할 수 있는 모든 것이 포함됩니다.

  • 환경 변수는 콘솔 로그인(예: '로그인' 쉘)과 그래픽 로그인(예: GDM, LightDM 또는 LXDM과 같은 디스플레이 관리자) 모두에서 읽을 수 있는 파일에 저장되어야 합니다.

  • 가지고 있는 데는 거의 의미가 없습니다둘 다 ~/.profile그리고 ~/.bash_profile. 후자가 없으면 bash는 전자를 기꺼이 사용하며 bash 관련 행은 $BASH또는 에 대한 확인으로 보호할 수 있습니다 $BASH_VERSION.

  • *profile와 사이의 구분은 *rc전자는 '로그인' 쉘에 사용되고 후자는 터미널 창을 열 때마다 사용된다는 것입니다. 그러나 'login' 모드의 bash는 source 를 수행하지 않으므로 ~/.bashrc수동 ~/.profile으로 수행해야 합니다.

그만큼가장 단순한구성은 다음과 같습니다:

  • ~/.profile모든 환경 변수(bash 관련 환경 변수 제외)를 설정하고 한두 줄을 인쇄한 다음 ~/.bashrcbash로 실행 중인 경우 소스를 출력하고 그렇지 않으면 sh 호환 구문을 고수하는 a를 사용하세요 .

    TZ="유럽/파리" 내보내기
    내보내기 편집기="vim"
    if [ "$BASH" ]; 그 다음에
        . ~/.bashrc
    fi
    가동 시간
    
  • ~/.bashrc쉘별 설정을 수행하는 를 갖고 다음 사항을 확인하여 보호하십시오.대화형 모드sftp데비안( ~/.bashrc비대화형 쉘에서도 로드할 수 있는 옵션으로 bash가 컴파일되는 경우) 과 같은 문제가 발생하지 않도록 하려면 다음을 수행하세요 .

    [[ $- == *i* ]] || 0을 반환
    
    PS1='\h \w \$ '
    
    start() { sudo 서비스 "$1" 시작; }
    

그러나 특정 비대화형 명령(예: ssh <host> ls)이 건너뛰는 문제도 있지만 ~/.profile환경 변수는 매우 유용할 것입니다.

  • ~/.bashrc특정 배포판(예: Debian)은 비대화형 로그인에 대한 소스 옵션을 사용하여 bash를 컴파일합니다 . 이 경우 모든 환경 변수( export ...라인)를 별도의 파일인 으로 이동 ~/.environ하고 다음에서 소싱하는 것이 유용하다는 것을 알았습니다.둘 다 .profile그리고 .bashrc두 번 하는 것을 방지하기 위해 가드를 사용합니다.

    만약에 ! [ "$PREFIX" ]; 그 다음에   #, $EDITOR, $TZ, 또는 ...
        . ~/.environ           # 일반적으로 .environ 자체가 설정하는 모든 변수
    fi
    
  • 불행하게도 다른 배포판(예: Arch)의 경우에는 아주 좋은 해결책을 찾지 못했습니다. 한 가지 가능성은 다음을 입력하여 pam_env PAM 모듈(기본적으로 활성화됨)을 사용하는 것입니다 ~/.pam_environment.

    BASH_ENV=./.environ        # 오타가 아닙니다. 경로여야 하는데 ~가 작동하지 않습니다.
    

    ~/.environ그런 다음 물론 unset BASH_ENV.


결론? 껍질은 고통입니다. 환경 변수는 고통스럽습니다. 배포판별 컴파일 타임 옵션은엄청난엉덩이 통증.

답변3

이것 좀 보세요ShreevatsaR의 훌륭한 블로그 게시물. 여기에 추출된 내용이 있지만 블로그 게시물로 이동하면 "로그인 셸"과 같은 용어에 대한 설명, 흐름 차트 및 Zsh에 대한 유사한 표가 포함되어 있습니다.

Bash의 경우 다음과 같이 작동합니다. 해당 열을 읽어보세요. A, B, C 등을 실행합니다. B1, B2, B3은 발견된 파일 중 첫 번째 파일만 실행한다는 의미입니다.

대화형 로그인 대화형 비로그인 스크립트
/etc/profile
/etc/bash.bashrc
~/.bashrc
~/.bash_profile 지하 1층
~/.bash_login 지하 2층
~/.profile B3
BASH_ENV
~/.bash_logout

답변4

나는 이것을 알아내려는 노력을 포기하고 ~/.shell-setup다른 모든 스크립트에서 소스를 얻은 하나의 스크립트( )를 만들었습니다.

이 접근 방식에는 ~/.shell-setup다음 두 가지 기능이 필요합니다.

  1. 반복적으로 소싱되는 경우에도 한 번만 실행하십시오(사용경비원 포함)
  2. 원치 않는 출력을 생성하지 마세요(출력이 괜찮은지 감지).

#1은 꽤 표준적이지만 쉘 스크립트에서는 많이 사용되지 않을 수도 있습니다.

#2는 더 까다롭다. bash에서 내가 사용하는 것은 다음과 같습니다.

if [ "" == "$BASH_EXECUTION_STRING" -a "" == "$DESKTOP_SESSION" ]; then
    echo "Hello user!" # ... etc
fi

불행히도 나는 내가 어떻게 그런 생각을 하게 되었는지, 왜 그런 생각을 했는지 기억이 나지 않습니다.대화형 쉘 감지충분하지 않았습니다.

관련 정보