쉘 스크립트는 여전히 #!없이 작동합니다 (sha-bang line) 인터프리터를 호출하는 많은

나는 쉘 스크립트를 처음 접했고 스크립트 시작시 #! (sha-bang) 줄을 사용하여 인터프리터를 호출하는 많은 책을 썼다. 내 기본 스크립트 중 여전히 마법 줄없이 실행 중입니다.

그래서 내 질문은 :

  • 내 기본 스크립트는 어디에서 통역사를 얻었습니까?
  • 스크립트가 어떻게 통역사를 찾게 되었습니까?

이제 기본 스크립트에 대해 설명하겠습니다. 다음 줄만 포함되어 있습니다.

echo “매직 라인이없는 기본 스크립트”



답변

매직 라인이 제공되지 않으면 기본 쉘이 스크립트를 실행하는 데 사용됩니다. 이 기본 셸은 Bourne 셸 (sh) 일 수 있지만 일부 특징의 경우 다른 특징의 경우 사용되는 기본 셸은이를 실행하기위한 로그인 셸과 동일합니다. 문제는 : 쉘을 결정하기 위해 시스템에 두지 말고 항상 첫 번째 줄에 원하는 쉘을 제공하십시오.


답변

프로그램을 실행할 때 커널은 어떤 매직 바이트 시퀀스로 시작하는지 확인합니다 . 실행 파일이로 시작 #!하면 커널은 나머지 행을 인터프리터 이름으로 해석합니다. 만약에 실행 파일이 시작 \177ELF(여기서 \177바이트 127 인), 그것이로 파일로드 ELF 실행 파일을; 그것은 오늘날 대부분의 유닉스 시스템에서 일반적인 종류입니다.

커널이 파일 형식을 인식하지 못하면 파일 실행을 거부하고 오류 ENOEXEC (Exec 형식 오류)를 반환합니다. 셸이이를 알아 차리면 프로그램을 셸 스크립트로 실행해야합니다.

이를 실제로 확인하려면 스크립트에 몇 가지 명령을 추가하십시오.

ps l $$
ls -l /proc/$$/exe
echo hello

(이것은 Linux 용이며 다른 유니스에 맞게 조정하십시오.) 그런 다음 다양한 쉘에서 해당 스크립트를 실행하십시오. 일부 쉘은 스크립트 (bash, ksh93)를 실행하기 위해 자체의 새로운 인스턴스를 생성하고 다른 쉘 /bin/sh(dash, pdksh, zsh)을 생성하는 것을 볼 수 있습니다 .


답변

아마도 다음 3 가지 가능성 중 하나 일 것입니다.

  1. 인터프리터 IE를 사용하여 스크립트를 직접 호출합니다. bash script.sh

  2. 스크립트 파일의 이름은 .sh 확장자를 가지며 시스템에서이 유형의 파일에 대한 기본 프로그램을 찾도록합니다.

  3. 스크립트 파일이 실행 가능하다고 추측 할 수 있기 때문에 사용중인 쉘 환경은 ‘echo’를 자체적으로 실행하고 있습니다. 예를 들어, bash 쉘을 사용하고 파일에 ksh 만 사용하는 명령이 있으면 작동하지 않습니다.

행운을 빕니다!