나는 쉘 스크립트를 처음 접했고 스크립트 시작시 #! (sha-bang) 줄을 사용하여 인터프리터를 호출하는 많은 책을 썼다. 내 기본 스크립트 중 여전히 마법 줄없이 실행 중입니다.
그래서 내 질문은 :
- 내 기본 스크립트는 어디에서 통역사를 얻었습니까?
- 스크립트가 어떻게 통역사를 찾게 되었습니까?
이제 기본 스크립트에 대해 설명하겠습니다. 다음 줄만 포함되어 있습니다.
echo "매직 라인이없는 기본 스크립트"
나는 쉘 스크립트를 처음 접했고 스크립트 시작시 #! (sha-bang) 줄을 사용하여 인터프리터를 호출하는 많은 책을 썼다. 내 기본 스크립트 중 여전히 마법 줄없이 실행 중입니다.
그래서 내 질문은 :
이제 기본 스크립트에 대해 설명하겠습니다. 다음 줄만 포함되어 있습니다.
echo "매직 라인이없는 기본 스크립트"
답변:
매직 라인이 제공되지 않으면 기본 쉘이 스크립트를 실행하는 데 사용됩니다. 이 기본 셸은 Bourne 셸 (sh) 일 수 있지만 일부 특징의 경우 다른 특징의 경우 사용되는 기본 셸은이를 실행하기위한 로그인 셸과 동일합니다. 문제는 : 쉘을 결정하기 위해 시스템에 두지 말고 항상 첫 번째 줄에 원하는 쉘을 제공하십시오.
/bin/sh
아니라 sh
, 적합한 PATH를 탐색하는 동안 발견 된 첫 번째 실행 파일 일뿐 입니다.
프로그램을 실행할 때 커널은 어떤 매직 바이트 시퀀스로 시작하는지 확인합니다 . 실행 파일이로 시작 #!
하면 커널은 나머지 행을 인터프리터 이름으로 해석합니다. 만약에 실행 파일이 시작 \177ELF
(여기서 \177
바이트 127 인), 그것이로 파일로드 ELF 실행 파일을; 그것은 오늘날 대부분의 유닉스 시스템에서 일반적인 종류입니다.
커널이 파일 형식을 인식하지 못하면 파일 실행을 거부하고 오류 ENOEXEC (Exec 형식 오류)를 반환합니다. 셸이이를 알아 차리면 프로그램을 셸 스크립트로 실행해야합니다.
이를 실제로 확인하려면 스크립트에 몇 가지 명령을 추가하십시오.
ps l $$
ls -l /proc/$$/exe
echo hello
(이것은 Linux 용이며 다른 유니스에 맞게 조정하십시오.) 그런 다음 다양한 쉘에서 해당 스크립트를 실행하십시오. 일부 쉘은 스크립트 (bash, ksh93)를 실행하기 위해 자체의 새로운 인스턴스를 생성하고 다른 쉘 /bin/sh
(dash, pdksh, zsh)을 생성하는 것을 볼 수 있습니다 .
ls -l
명령으로 무엇을 찾아야 합니까? 이것 : lrwxrwxrwx 1 i 0 Oct 11 05:15 exe -> /bin/bash
-? 그렇다면 무엇을 말합니까? 또한, 나는이 눈치 SHELL=/bin/bash
에 env
, 그러나 변화 행동을 보이지 않았다 변경. 아마 관련이 없습니까?
ls -l /proc/$$/exe
실제로 글을 써야합니다 ). exe
스크립트를 실행하는 것 쉘에 대한 링크를 가리 킵니다. 스크립트를 실행하면 스크립트를 해석하는 것이 bash임을 알 수 있습니다. 예를 들어 pdksh에서 실행하면 실행됩니다 /bin/sh
. 해당 SHELL
환경 에서 환경 변수 또는 로그인 쉘 을 사용하는 쉘을 모릅니다 .
/etc/passwd
변경하면 SSH 또는 텍스트 콘솔을 통해 로그인 할 때 실행되는 쉘이 변경됩니다. 스크립트를 실행할 수있는 쉘은 변경하지 않습니다.
/etc/passwd
한 쉘 중 어느 쉘을 사용할지 결정하지 않았으며, 인스턴스를 포크하거나 실행했습니다 /bin/sh
.
아마도 다음 3 가지 가능성 중 하나 일 것입니다.
인터프리터 IE를 사용하여 스크립트를 직접 호출합니다. bash script.sh
스크립트 파일의 이름은 .sh 확장자를 가지며 시스템에서이 유형의 파일에 대한 기본 프로그램을 찾도록합니다.
스크립트 파일이 실행 가능하다고 추측 할 수 있기 때문에 사용중인 쉘 환경은 'echo'를 자체적으로 실행하고 있습니다. 예를 들어, bash 쉘을 사용하고 파일에 ksh 만 사용하는 명령이 있으면 작동하지 않습니다.
행운을 빕니다!