소스(또는 도트 명령)가 파일 실행을 요구하지 않는 이유 [복제]

소스(또는 도트 명령)가 파일 실행을 요구하지 않는 이유 [복제]

달리기에서 help .또는help source

현재 셸의 파일에 있는 명령을 실행합니다.

현재 셸의 FILENAME에서 명령을 읽고 실행합니다. $PATH의 항목은 FILENAME이 포함된 디렉터리를 찾는 데 사용됩니다.

내 관점에서 dot 명령(또는 명령 source)은 (다른 쉘을 생성하는 대신) 현재 쉘 컨텍스트에서 쉘 스크립트를 실행하는 것처럼 보입니다.

질문.source: 일반 스크립트를 실행하는 것처럼 파일을 실행할 수 있도록 요구 하지 않는 이유는 무엇입니까 ?

답변1

my-script.sh다음으로 시작 하는 쉘 스크립트( )가 있다고 가정해 보겠습니다 .

#!/bin/sh

스크립트에 실행 권한이 설정되어 있으면 다음을 사용하여 스크립트를 실행할 수 있습니다.

./my-script.sh

이 경우 커널에 프로그램으로 실행하도록 요청하게 되고 my-script.sh커널(프로그램 로더)이 먼저 권한을 확인합니다.그런 다음/bin/sh ./my-script.sh실제로 스크립트를 실행 하기 위한 것입니다 .

하지만 shell( /bin/sh)은 실행 권한에 신경 쓰지 않고 확인하지도 않습니다. 그래서 이렇게 부르면...

/bin/sh ./my-script.sh

...커널은 my-script.sh프로그램으로 실행될 필요가 없습니다. 커널(프로그램 로더)은 /bin/sh. 따라서 실행 권한은 절대로 확인되지 않습니다. 즉, 이러한 스크립트를 실행하는 데 실행 권한이 필요하지 않습니다.


귀하의 질문에 대답하십시오 :

./my-script.sh호출하는 것과 다른 스크립트에서 호출하는 것의 차이점은 . ./my-script.sh정확히 같습니다. 첫 번째에서는 커널에 프로그램으로 실행하도록 요청하고, 두 번째에서는 현재 셸에 스크립트에서 명령을 읽도록 요청하며, 셸에서는 이를 수행하기 위한 실행 권한이 필요하지 않습니다(또는 신경 쓰지 않음).


추가 자료:

스크립트를 프로그램으로 실행하는 것은 생각해 보면 놀라운 동작입니다. 기계어 코드로 작성되지 않았습니다. 이것이 왜 작동하는지 읽어보겠습니다 #!.https://en.wikipedia.org/wiki/Shebang_(유닉스)

공유 변수에는 점 표기법을 사용하여 스크립트를 실행해야 합니다. 다른 모든 실행 메커니즘은 새로운 셸 "컨텍스트"를 시작합니다. 이는 호출된 스크립트에 설정된 모든 변수가 호출 스크립트로 다시 전달되지 않음을 의미합니다. Bash 문서는 약간 요약되어 있지만 여기에는 다음과 같은 내용이 있습니다.https://www.gnu.org/software/bash/manual/html_node/Bourne-Shell-Builtins.html

답변2

source script.sh당신이 말 하거나 . script.sh스크립트를 실행하지 않을 때 . 당신이 실행하고 있는 것은 source어떤 일을 하는 쉘 명령입니다. 이 "사물"은 script.sh에서 읽고 읽은 내용을 실행하는 것으로 구성됩니다. 이것이 작동하려면 스크립트를 읽을 수 있어야 합니다. 강제성은 필요하지 않습니다.

동작은 달리기 bash non-executable-script.sh등과 유사합니다.python non-executable-script.py

관련 정보