왜 .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.