bash myscript.sh는 bash에서 실행되지만 첫 번째 줄은 #!/usr/bin/sh입니다.

bash myscript.sh는 bash에서 실행되지만 첫 번째 줄은 #!/usr/bin/sh입니다.

다음과 유사한 스크립트가 있습니다.

#!/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/bash3에서 bash를 찾습니다 . 찾은 처음 2바이트 /usr/bin/bash는 not 이므로 #!/usr/bin/bash test.sh번째 줄도 보지 않고 실행됩니다.test.sh.

두 경우 모두 Shebang 줄은 sh실제로 bash무시됩니다. 로 시작하는 줄은 #주석이기 때문입니다. 이런 마법을 수행하는 유일한 것은 #셸이 아니라 운영 체제입니다.

추가 정보:

각주:

  1. 실제로 이는 반드시 쉘일 필요는 없지만 모든 프로그램일 수 있습니다.
  2. 실제로는 더 비슷합니다 execl("./test.sh", "/usr/bin/sh", "./test.sh", NULL).
  3. /bin/sh대부분의 Linux 시스템에서 문제는 Solaris에 관한 것입니다.

답변2

bash를 사용하여 스크립트를 실행(running bash test.sh)한다는 것은 Bourne 셸(/bin/sh)이 아닌 bash를 사용하여 스크립트가 해석된다는 의미입니다. 그것이 작동하는 이유입니다. Bash는 #!/bin/sh가 주석이기 때문에 무시합니다. 그것은 단지 당신 것입니다운영 체제 프로그램 로더bash 없이 쉘 스크립트를 실행하면( ./test.sh예: run) /bin/sh가 시작됩니다.

관련 정보