달리기에서 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