왜 .bashrc / .bash_profile에 shebang이 없습니까?


22

간단한 질문 : 방금 스크립트 위에서 shebang 을 본 적이 없다는 것을 깨달았습니다 .bashrc. 이로 인해 시스템이 기본 쉘을 사용하여 로그인 할 때 소스를 사용한다고 생각하게합니다 ( ${SHELL}). 이유가 무엇인지에 대해 숙고하고 있습니다. 즉, 로그인 스크립트를 실행하기 위해 기본 쉘 이외의 것을 사용하는 것은 나쁜 습관으로 간주됩니다.


1
그것이 bash rc 라고 불리는 이유가 있습니다 .
— Ajedi32

답변:


28

.bashrc하고 .bash_profile있습니다 NOT 스크립트. 그것들은 bash다음 두 가지 방법 중 하나로 실행될 때마다 소싱되는 구성 파일입니다 .

  • 대화식
  • 로그인

bash 매뉴얼 페이지 의 INVOCATION 섹션은 관련이 있습니다.

로그인 쉘은 하나의 그 첫 번째 문자 인수 0의이다 -, 또는 시작 하나의 --login옵션을 선택합니다.

대화식 쉘은 하나의 비 옵션 인수없이 상기없이 시작되고 -c, 그 표준 입력 및 에러에 의해 결정되는 양 (단자에 접속되는 옵션 isatty(3)), 또는 하나가 시작 -i 옵션. PS1 설정되어 $-포함되어 i있는 경우 bash대화식 쉘 스크립트를 허용 또는이 상태를 테스트하기위한 시작 파일.

다음 단락 bash에서는 시작 파일을 실행 하는 방법에 대해 설명 합니다. 파일이 존재하지만 읽을 수없는 경우 bash는 오류를보고합니다. 틸드 는 EXPANSION 섹션의 틸드 확장 아래에 설명 된대로 파일 이름으로 확장 됩니다 .

bash가 대화식 로그인 쉘 또는 --login옵션이 있는 비 대화식 쉘로 호출 될 때 /etc/profile파일이 존재하는 경우 먼저 파일에서 명령을 읽고 실행 합니다. 해당 파일을 읽은 후, 그것은을 찾습니다 ~/.bash_profile, ~/.bash_login그리고 ~/.profile, 순서대로, 그리고 읽고 존재하고 읽을 수있는 첫 번째에서 실행하는 명령을. --noprofile쉘이 동작을 억제하기 시작할 때 옵션을 사용할 수있다.

로그인 쉘이 종료되면 bash는 파일에서 명령을 읽고 실행합니다 (있는 ~/.bash_logout경우).

때 대화 형 로그인 쉘이 시작되지 않은 쉘, bash는 읽기 및 실행하는 명령에서 ~/.bashrc해당 파일이 존재하는 경우. 이 --norc옵션 을 사용하여 금지 할 수 있습니다 . 이 --rcfile file 옵션은 bash가 파일 대신 명령을 읽고 실행하도록합니다 ~/.bashrc.

당신은이 명령 줄 스위치를 통해로드되는시기를 제어, 수 --norc및 --noprofile. --rcfile스위치 를 사용하여로드 된 위치를 무시할 수도 있습니다 .

다른 사람들이 언급했듯이 source <file>명령 사용 또는 명령 사용을 통해 이러한 파일을로드하는 방법을 모방 할 수 있습니다 . <file>.

이 기능을 다음과 같이 생각하는 것이 가장 좋습니다.

  1. bash는 베어 환경으로 시작합니다
  2. bash는 대화 형 또는 로그인으로 호출 된 방법에 따라 이러한 파일 중 하나를 연 다음 ...
  3. ... 한 줄씩 파일 내의 각 명령을 실행합니다 ...
  4. 완료되면 프롬프트 형태로 제어를 제공하고 입력 대기

호출 방법

이 주제는 가끔씩 등장하는 것처럼 보이므로 여기에는 다양한 호출 방법 bash및 결과에 대한 약간의 설명이 있습니다. 참고 : "sourced $ HOME / .bashrc"및 "sourced"메시지를 추가했습니다. $ HOME / .bash_profile "을 해당 파일에 추가하십시오.

기본 통화

  1. bash -i

    $ bash -i
    sourced /home/saml/.bashrc
  2. bash -l

    $ bash -l
    sourced /home/saml/.bashrc
    sourced /home/saml/.bash_profile
  3. bash -il-또는-bash -li

    $ bash -il
    sourced /home/saml/.bashrc
    sourced /home/saml/.bash_profile
  4. bash -c "..cmd .."

    $ bash -c 'echo hi'
    hi

    참고 : 공지 사항이 있다는 -c스위치 중 하나를 파일을 소스하지 않았다!

구성 파일을 읽을 수 없도록 설정

  1. bash --norc

    $ bash --norc
    bash-4.1$ 
  2. bash --noprofile

    $ bash --noprofile
    sourced /home/saml/.bashrc
  3. bash --norc -i

    $ bash --norc -i
    bash-4.1$ 
  4. bash --norc -l

    $ bash --norc -l
    sourced /home/saml/.bashrc
    sourced /home/saml/.bash_profile
  5. bash --noprofile -i

    $ bash --noprofile -i
    sourced /home/saml/.bashrc
  6. bash --noprofile -l

    $ bash --noprofile -l
    bash-4.1$ 
  7. bash --norc -i-또는-bash --norc -l

    $ bash --norc -c 'echo hi'
    hi

bash를 호출하는 더 난해한 방법

  1. bash --rcfile $ HOME / .bashrc

    $ bash -rcfile ~/.bashrc 
    sourced /home/saml/.bashrc
  2. bash --norc --rcfile $ HOME / .bashrc

    $ bash --norc -rcfile ~/.bashrc 
    bash-4.1$ 

이것들은 실패했습니다

  1. bash -i -rcfile ~ / .bashrc

    $ bash -i -rcfile ~/.bashrc 
    sourced /home/saml/.bashrc
    sourced /home/saml/.bash_profile
    bash: /home/saml/.bashrc: restricted: cannot specify `/' in command names
  2. bash -i -rcfile .bashrc

    $ bash -i -rcfile .bashrc
    sourced /home/saml/.bashrc
    sourced /home/saml/.bash_profile
    bash: .bashrc: command not found

아마도 더 많은 것이 있지만 당신은 요점을 얻습니다.

또 뭐요?

마지막으로이 주제에 관심이 많고 더 많은 내용을 읽고 탐구하고 싶다면 Bash Beginners Guide, 특히 섹션 1.2를 살펴 보는 것이 좋습니다 . Bourne의 장점은 다시 소리 쳤다 . "1.2.2.1. 호출" 에서 "1.2.2.3.3. 대화식 쉘 동작" 까지 의 여러 하위 섹션에서는 호출 할 수있는 다양한 방법 간의 낮은 수준의 차이를 설명합니다 bash.


@ amphibient-미안하지만 조금 손에 들지 않기 때문에 사람들은 가치를 높이 평가하고 downvotes로 처벌하지 않기를 바랍니다. 이것으로 우리는 이제 다른 길에서 그것을 참조 할 수 있습니다. 8-). 나는 이것을 보여주기 위해 테이블을 만드는 것을 고려했지만 8-) 미친 것 입니다.
— slm

실제로 이것을 테스트 했습니까? 나는 한 번 내 배쉬가 쥐어 짜기에서 수행하는 것을 따르려고 시도했지만 매뉴얼이 제안한대로 작동하지
— 않았습니다.

@Bananguin-모든 명령은 나에 의해 실행되었으며 명령 아래에서 생성 된 출력입니다. 내 설정에서 유일하게 가능한 "것"은 .bash_profile소스를 포함하는 줄을 포함하는 것일 수 있습니다 .bashrc. 그러나 나는 매우 전형적인 설정이라고 생각합니다.
— slm

이 주관적 일 수 있지만 언급하지 않았다 .bashrc및 .bash_profile스크립트 없습니다 . IMHO는 bash 초기화 중에 또는 명시 적으로 수정 사항을 적용해야 할 때 명시 적으로 제공되는 특정 목적의 스크립트입니다. 그들은 구성 파일에서 예상대로 bash 환경 (변수, 함수, 별명 ...)을 구성하지 않습니다. 일반적인 스크립트에서와 같이 모든 작업을 수행 할 수 있습니다. 예를 들어 백그라운드 작업, 로그 레코드 쓰기, 일부 프로그램 초기화 등과 같은 다양한 작업을 시작할 수 있습니다. 어쨌든 자세한 요약에 감사드립니다!
— pabouk

이 답변은 여기의 답변보다 낫습니다 . stackoverflow.com/questions/415403/… !
— Jacob Tomlinson

13

.bashrc스크립트는 bash자체적 으로 만 실행됩니다 . 그것들은 독립형이 아니며 exec시스템에 의해 사용 되지 않습니다 . (실제로, 그것들은 일반적으로 실행 가능한 것으로 표시되지 않으며, 당신이 말하는 것처럼 shebang 라인이 없습니다.)

이러한 스크립트는 source일반적으로 $PATH스크립트가 완료된 후에도 지속될 것으로 예상되는 환경 변수 변경 ( 예 :)과 같은 작업을 수행 하기 때문에 d 로 작성되었습니다 . 따라서 서브 쉘에서 하나를 실행하는 것은 실제로 의미가 없습니다.


5

다른 답글 외에도 원하는 경우 이러한 구성 파일의 시작 부분에 shebang을 넣을 수 없습니다.

Shebang이 일반적인 주석처럼 처리되므로 쉘을 소싱하는 데 아무런 영향을 미치지 않습니다.

구문 강조를 사용하여 파일에서 어떤 프로그래밍 언어가 사용되는지 파악하는 편집기에 도움이 될 수 있습니다.

vim그래도 일부 편집자 는 후자에 대한 모델과 같은 대체 방법을 제공합니다. 당신은 항상 끝에 모드 라인을 넣을 수 있습니다 즉 ~/.bashrc및 ~/.bash_profile과 같이 :

...
<code in ~/.bashrc>
...
# vim: ft=sh :

1
위의 @ slm에서 받아 들인 대답은 훌륭하지만 .bash_profileShellCheck의 권장 사항에 대한 시작 부분에 shebang을 추가하는 것과 관련하여 내가 찾고있는 것입니다 .
— jlucktay

1

나는 어디에서나 이것을 정확히 알지 못하지만 사실이다.

Bash 매뉴얼은이 영역에서 약간 혼란 스럽지만 Bash는 쉘 스크립트처럼 ~ / .bash_profile을 eXecute하지 않습니다. 파일을 읽은 다음 파일 내에서 명령을 실행합니다 (source ~ / .bash_profile을 실행하여 비슷한 작업을 수행 할 수 있음).

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