script.sh가 다음과 같은 일반적인 것이라면
#!/bin/bash
echo "Hello World!"
스크립트를 실행하는 데 선호되는 방법이 있나요? 실행 가능하도록 먼저 chmod를 수행해야 한다고 생각합니까?
답변1
특정 스크립트의 경우 ./script.sh
실행 가능하고 읽을 수 있는 비트와 bash script.sh
읽을 수 있는 비트만 필요하다는 점을 제외하면 두 가지 접근 방식 모두 작동합니다.
권한 요구 사항이 다른 이유는 스크립트를 해석하는 프로그램이 로드되는 방식 때문입니다.
./script.sh
쉘이 파일을 일반 실행 파일인 것처럼 실행하도록 합니다.
셸은 자체적으로 포크를 수행하고 시스템 호출(예: execve
)을 사용하여 운영 체제가 포크된 프로세스에서 파일을 실행하도록 합니다. 운영 체제는 파일의 권한을 확인하고(따라서 실행 비트를 설정해야 함) 요청을 다음으로 전달합니다.프로그램 로더, 파일을 보고 실행 방법을 결정합니다. Linux에서 컴파일된 실행 파일은 다음으로 시작합니다.매우 낮은 주파수매직 넘버, #!
매직 넘버가 포함된 스크립트, (해시 스틱). hashbang 헤더는 파일이 스크립트이고 hashbang 다음에 지정된 프로그램에 의해 해석되어야 함을 의미합니다. 이를 통해 스크립트 자체가 시스템에 스크립트 해석 방법을 알려줄 수 있습니다.
스크립트의 경우 프로그램 로더가 실행되어 /bin/bash
명령줄 인수로 전달됩니다../script.sh
bash script.sh
쉘을 실행하고 명령줄 인수로bash
전달하십시오 .script.sh
따라서 OS가 로드됩니다 ( 단순한 명령줄 인수이기 때문에 bash
살펴보지도 않고 ). script.sh
생성된 프로세스는 명령줄 인수로 전달된 것처럼 bash
해석됩니다 . 일반 파일로만 읽기 script.sh
때문에 실행 비트가 필요하지 않습니다.script.sh
bash
./script.sh
하지만 스크립트에 어떤 인터프리터가 필요한지 알 수 없으므로 사용하는 것이 좋습니다 . 따라서 프로그램 로더가 이를 결정하도록 하십시오.
답변2
bash script.sh
bash를 사용하여 스크립트를 직접 호출하세요.
./script.sh
Shebang은 #!/bin/bash
실행 방법을 결정하는 데 사용됩니다.
bash script.sh
어떤 바이너리가 실행되는지 정말로 알고 싶다면 which bash
.
따라서 귀하의 경우에는 차이가 없습니다. 네, chmod +x script.sh
직접 통과가 가능 해야 합니다 ./script.sh
.
답변3
다음과 같이 Delete_Self.sh 파일을 생성합니다.
#!/bin/rm
echo I am still here!
이 스크립트를 실행하면 sh Delete_Self.sh
"아직 여기 있어요!"라는 메시지가 표시됩니다.
실행 가능하게 만든 다음 실행하면 ./Delete_Self.sh
에코가 없고 파일 Delete_Self.sh
자체가 사라지는 것을 볼 수 있습니다.
차이점은 다음과 같습니다.
bash script.sh
script.sh를 실행하는 프로그램으로 bash가 지정되어 있으므로 #! 행은 무시됩니다../script.sh
#! 행을 읽어서 실행할 프로그램을 결정합니다script.sh
.
답변4
다른 답변 외에도 ./script.sh
(i)와 source ./script.sh
(ii)를 통해 스크립트를 실행하는 것의 차이점을 아는 것이 유용합니다. - (i) 버전은 명령을 실행하기 위해 새 셸을 생성하는 반면 (ii)는 현재 셸에서 실행합니다. - if 실행 파일이 종료된 후 유지해야 하는 환경 변수를 실행 파일이 변경하는 경우 명령이 필수일 수 있습니다. 예를 들어 Python conda 환경을 활성화하려면 다음 명령을 사용해야 합니다.
source activate my_env
source
발생할 수 있는 또 다른 옵션이 .
내장되어 있습니다.
. activate my_env