쉘 스크립트는 여전히 #!없이 작동합니다 (sha-bang line)


10

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

그래서 내 질문은 :

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

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

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


답변:


3

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


1
yup .. 현재 쉘이 마법 번호가없는 쉘 스크립트의 기본 쉘을 호출하고있을 수 있습니다.
user1678213

1
@ user1678213 예,이 작업을 수행하는 것은 쉘이 아니라 커널입니다.
Gilles 'SO- 악마

1
POSIX는이 경우 / bin / sh가 사용되어야한다고 생각합니다.
vonbrand

2
@vonbrand 이것은 일반적인 오해입니다. POSIX는 POSIX 쉘을 강제하는 것이 /bin/sh아니라 sh, 적합한 PATH를 탐색하는 동안 발견 된 첫 번째 실행 파일 일뿐 입니다.
jlliagre

3
그것은 틀렸다. 그것을 실행하는 데 사용되는 "로그인 쉘" 은 결코 아니다. 그래도 호출 쉘 (스크립트에서 쉘에서 호출 된 경우)은이를 해석하는 자식이있을 수 있습니다.
Stéphane Chazelas

8

프로그램을 실행할 때 커널은 어떤 매직 바이트 시퀀스로 시작하는지 확인합니다 . 실행 파일이로 시작 #!하면 커널은 나머지 행을 인터프리터 이름으로 해석합니다. 만약에 실행 파일이 시작 \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/bashenv, 그러나 변화 행동을 보이지 않았다 변경. 아마 관련이 없습니까?
Emanuel Berg

셸 변수 "SHELL"을 변경하는 것처럼 보입니다. 그렇다면 셸 변수 SHELL.it의 값만 변경하면 셸을 변경하지 않습니다. 셸을 변경하려면 / etc / passwd 파일을 편집하십시오.
user1678213

2
@EmanuelBerg 예 ( ls -l /proc/$$/exe실제로 글을 써야합니다 ). exe스크립트를 실행하는 것 쉘에 대한 링크를 가리 킵니다. 스크립트를 실행하면 스크립트를 해석하는 것이 bash임을 알 수 있습니다. 예를 들어 pdksh에서 실행하면 실행됩니다 /bin/sh. 해당 SHELL환경 에서 환경 변수 또는 로그인 쉘 을 사용하는 쉘을 모릅니다 .
Gilles 'SO- 악마 중지'10

2
@ user1678213 쉘을 /etc/passwd변경하면 SSH 또는 텍스트 콘솔을 통해 로그인 할 때 실행되는 쉘이 변경됩니다. 스크립트를 실행할 수있는 쉘은 변경하지 않습니다.
Gilles 'SO- 악마 그만해'10

2
@ user1678213 테스트를 실행하여 여기에 쓴 내용을 확인했습니다. 테스트 /etc/passwd한 쉘 중 어느 쉘을 사용할지 결정하지 않았으며, 인스턴스를 포크하거나 실행했습니다 /bin/sh.
Gilles 'SO- 악마 그만해'10

-2

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

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

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

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

행운을 빕니다!


3
bash 나 확장명으로도 호출하지 않았습니다.
user1678213

1
쉘 환경은 스크립트를 호출 한 후 ps 명령을 호출 할 때 실행되지 않습니다. ps 명령은 두 개의 bash 프로세스를 보여줍니다. 이는 두 개의 bash가 실행 중임을 의미합니다. 하나는 내 로그인 bash 쉘이고 다른 하나는 내 basic_script에 대한 bash입니다
user1678213

1
2 : 커널은 그렇게하지 않습니다. Zsh는 그것을 할 수 있고, bash는 그것을 할 수 있습니다. 3 : 그렇습니다.하지만 껍질마다 약간 다릅니다. 내 대답을 참조하십시오.
Gilles 'SO- 악마 그만해
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.