답변:
./script.sh
실행 및 읽기 가능한 비트 bash script.sh
가 필요한 반면 읽기 가능한 비트 만 필요한 경우를 제외하고 특정 스크립트의 경우 어느 쪽이든 작동 합니다.
권한 요구 사항 차이의 이유는 스크립트를 해석하는 프로그램이로드되는 방법에 있습니다.
./script.sh
쉘이 일반 실행 파일 인 것처럼 파일을 실행하게합니다.쉘은 자체를 포크하고 시스템 호출 (예 :) execve
을 사용하여 운영 체제가 분기 프로세스에서 파일을 실행하게합니다. 운영 체제는 파일의 권한을 확인하고 (따라서 실행 비트를 설정해야 함) 요청을 프로그램 로더에 전달합니다.이 로더 는 파일을보고 파일을 실행하는 방법을 결정합니다. Linux에서 컴파일 된 실행 파일은 ELF 매직 번호로 시작하고 스크립트는 #!
( hashbang )으로 시작 합니다. hashbang 헤더는 파일이 스크립트이며 hashbang 다음에 지정된 프로그램에서 해석해야 함을 의미합니다. 이를 통해 스크립트 자체가 시스템에 스크립트 해석 방법을 알려줄 수 있습니다.
스크립트로, 프로그램 로더는 실행됩니다 /bin/bash
및 전달할 ./script.sh
명령 줄 인수로.
bash script.sh
쉘을 실행 bash
하고 script.sh
명령 행 인수로 전달합니다.따라서 운영 체제가로드됩니다 bash
( script.sh
명령 행 인수이기 때문에 조차 보지 않아도 됩니다 ). 작성된 bash
프로세스는 script.sh
명령 행 인수로 전달되므로 해석합니다 . 일반 파일 script.sh
로만 읽기 때문에 bash
실행 비트는 필요하지 않습니다.
./script.sh
스크립트에 어떤 인터프리터가 필요한지 알 수 없으므로 그래도 사용하는 것이 좋습니다 . 따라서 프로그램 로더가이를 결정하게하십시오.
. ./script.sh
은 bash script.sh
(또는 ./script.sh
. #!/usr/bin/python -V
<newline> 스크립트를 고려하십시오 print test
.
. script.sh
. 그러나 나는 .
그런 식으로 호출되지 않은 스크립트 에서 명령을 사용하지 않는 사람들에 동의합니다 . 스크립트에 exit
명령이 포함되어 있고 소스를 제공하면 로그 아웃 할 수 있다고 언급 한 사람이 아무도 없습니다 . 스크립트가를 수행하는 경우 덜 심각한 문제는 cd
부모 (대화식) 셸에도 영향을 미치기 때문입니다.
bash script.sh
bash를 사용하여 스크립트를 직접 호출합니다. 실행 방법을 결정하기 위해
./script.sh
shebang #!/bin/bash
을 사용하고 있습니다.
당신이 정말로 알고 싶다면, 당신이 할 경우 어떤 바이너리가 실행되는지 알 수 bash script.sh
있습니다 which bash
.
따라서 귀하의 예에서는 차이가 없습니다. 예,를 chmod +x script.sh
통해 직접 실행할 수 있어야합니다 ./script.sh
.
/bin/bash
첫 번째 없다 bash
당신에서 $PATH
.
#!/bin/bash
은 /bin/bash
./script.sh
.
다음과 같이 Delete_Self.sh 파일을 작성하십시오.
#!/bin/rm
echo I am still here!
sh Delete_Self.sh
"여전히 여기 있어요!"와 같이이 스크립트를 실행 하십시오. 다시 반향.
./Delete_Self.sh
파일 Delete_Self.sh
자체가 사라지는 동안 아무것도 다시 에코되는 것을 볼 수 있으므로 실행 파일로 만들고 실행 하십시오 .
차이점은 다음과 같습니다.
bash script.sh
#을 무시합니다! bash가 script.sh를 실행하기위한 프로그램으로 지정 되었기 때문입니다../script.sh
#을 읽을 것이다! 실행할 프로그램을 결정하는 행 script.sh
.