다음과 유사한 스크립트가 있습니다.
#!/usr/bin/sh
var="ABC"
if [ $var == "ABC" ]
then
echo True
else
echo False
fi
위 코드는 Solaris Sparc 및 Solaris X64에서는 작동하지 않습니다. 정의되지 않은 것으로 표시됩니다 ==
. ==
위의 코드 는 =
.
이상한 점은 위 코드를 아무런 변경 없이 다음 메서드를 통해 실행하면 작동한다는 것입니다.
#bash test.sh
내가 이해한 바로는, 내가 사용하고 있는 스크립트의 상단이 비교 연산자를 #!/bin/sh
지원하지 않기 때문에 이 스크립트는 bash에서도 작동하지 않아야 합니다.==
위에서 언급한 스크립트를 실행할 때 왜 실제로 작동하는지 설명할 수 있는 사람이 있습니까?
참고: 나는 bash가 ==
및 =
.
답변1
스크립트의 첫 번째 줄을 라인 #!
(때때로"쉐본"철사).
다음과 같이 스크립트를 직접 실행할 때만 사용하십시오.
./test.sh
설명하다
실행 파일을 실행할 때 운영 체제는 처음 2바이트를 보고 프로그램 유형을 결정합니다.
당신이 달릴 때
./test.sh
운영 체제가 보는 처음 2바이트 ./test.sh
는 #!
이므로 프로그램이 스크립트라는 것을 알 수 있습니다.
스크립트를 실행하는 데 사용해야 하는 쉘 1 을 확인하기 위해 나머지 줄을 읽습니다 . 이 경우 줄의 나머지 부분은 이므로 2 가/usr/bin/sh
실행됩니다 ./usr/bin/sh test.sh
당신이 달릴 때
bash test.sh
/usr/bin/bash
3에서 bash를 찾습니다 . 찾은 처음 2바이트 /usr/bin/bash
는 not 이므로 #!
첫 /usr/bin/bash test.sh
번째 줄도 보지 않고 실행됩니다.test.sh.
두 경우 모두 Shebang 줄은 sh
실제로 bash
무시됩니다. 로 시작하는 줄은 #
주석이기 때문입니다. 이런 마법을 수행하는 유일한 것은 #
셸이 아니라 운영 체제입니다.
추가 정보:
각주:
- 실제로 이는 반드시 쉘일 필요는 없지만 모든 프로그램일 수 있습니다.
- 실제로는 더 비슷합니다
execl("./test.sh", "/usr/bin/sh", "./test.sh", NULL)
. /bin/sh
대부분의 Linux 시스템에서 문제는 Solaris에 관한 것입니다.
답변2
bash를 사용하여 스크립트를 실행(running bash test.sh
)한다는 것은 Bourne 셸(/bin/sh)이 아닌 bash를 사용하여 스크립트가 해석된다는 의미입니다. 그것이 작동하는 이유입니다. Bash는 #!/bin/sh가 주석이기 때문에 무시합니다. 그것은 단지 당신 것입니다운영 체제 프로그램 로더bash 없이 쉘 스크립트를 실행하면( ./test.sh
예: run) /bin/sh가 시작됩니다.