쉘 스크립트는 #(sha-bang 줄) 없이도 작동합니다.

쉘 스크립트는 #(sha-bang 줄) 없이도 작동합니다.

저는 쉘 스크립팅을 처음 접했고, 인터프리터를 호출하기 위해 스크립트 시작 부분에 #!(sha-bang) 줄을 사용하는 방법에 대한 많은 책이 저술되었습니다. 그러면 스크립트에 대한 새 셸이 호출되고 한 줄씩 해석됩니다. 하지만 내 기본 스크립트는 여전히 매직 라인 없이 실행되고 있습니다.

그래서 내 질문은 다음과 같습니다

  • 내 기본 스크립트는 어디에서 통역사를 가져옵니다.
  • 스크립트는 인터프리터를 어떻게 찾나요?

이제 다음 줄만 포함된 기본 스크립트를 보여 드리겠습니다.

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

답변1

프로그램을 실행할 때 커널은 해당 프로그램이 어떤 프로그램에 의해 시작되었는지 확인합니다.매직 바이트 시퀀스. 실행 파일이 로 시작하면 #!커널은 나머지 줄을 인터프리터 이름으로 해석합니다. 실행 파일이 \177ELF( \177바이트 127)로 시작하면 파일을 다음과 같이 로드합니다.매우 낮은 주파수실행 파일. 이는 오늘날 대부분의 UNIX 시스템에서 일반적인 유형입니다.

커널이 파일 형식을 인식하지 못하면 파일 실행을 거부하고 ENOEXEC(Execution Format Error) 오류를 반환합니다. 쉘이 이를 발견하면 프로그램 자체를 쉘 스크립트로 실행합니다.

이를 확인하려면 스크립트에 몇 가지 명령을 추가하세요.

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

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

답변2

Magic Line이 제공되지 않으면 기본 쉘을 사용하여 스크립트를 실행합니다. 이 기본 셸은 Bourne 셸(sh)일 수 있는데, 이는 일부 버전의 경우이지만 다른 버전에서는 사용되는 기본 셸이 실행되는 로그인 셸과 동일합니다. 문제는 시스템이 쉘을 결정하도록 두지 말고 항상 첫 번째 줄에 원하는 쉘을 제공한다는 것입니다.

답변3

다음 3가지 가능성 중 하나일 수 있습니다.

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

  2. 스크립트 파일의 이름에는 .sh 확장자가 있어 시스템이 해당 파일을 찾는 기본 프로그램이 됩니다.

  3. 당신이 사용하고 있는 쉘 환경은 스크립트 파일이 실행 가능하다고 추측할 수 있기 때문에 자체적으로 "echo"를 실행하고 있습니다. 예를 들어, bash 쉘을 사용할 예정이고 파일에 ksh에서만 사용되는 명령이 있는 경우 해당 명령이 작동하지 않는다는 것을 알게 될 것입니다.

행운을 빌어요!

관련 정보