script.sh가 일반적인 경우
#!/bin/bash echo "Hello World!"
스크립트를 실행하는 방법? 먼저 chmod를 실행하여 실행할 수 있어야한다고 생각하십니까?
Answer
특정 스크립트의 경우 어느 쪽이든 작동합니다. ./script.sh
에는 실행 및 읽기 가능한 비트가 필요하지만 bash script.sh
에는 읽기 가능한 비트 만 필요합니다.
이유 권한 요구 사항의 차이점은 스크립트를 해석하는 프로그램이로드되는 방식에 있습니다.
-
./script.sh
는 셸이 일반 파일처럼 파일을 실행하도록합니다. 실행 가능.
쉘은 자체적으로 분기하고 시스템 호출 (예 : execve
)을 사용하여 운영 체제가 분기 된 프로세스에서 파일을 실행하도록합니다. 운영 체제는 파일의 권한을 확인하고 (따라서 실행 비트를 설정해야 함) 요청을 프로그램 로더 로 전달하여 파일을 찾습니다. Linux에서 컴파일 된 실행 파일은 ELF 매직 넘버로 시작하고 스크립트는 #!
( hashbang ). hashbang 헤더는 파일이 스크립트이고 hashbang 다음에 지정된 프로그램에서 해석되어야 함을 의미합니다. 이렇게하면 스크립트가 허용됩니다. 시스템에 스크립트 해석 방법을 알려줍니다.
스크립트를 사용하여 프로그램 로더는 /bin/bash
를 실행하고 ./script.sh
를 명령 줄 인수로 사용합니다.
-
bash script.sh
는 쉘이bash
를 실행하도록합니다.script.sh
명령 줄 인수
따라서 운영 체제는 (script.sh
는 명령 줄 인수 일 뿐이므로 보지 않음). 생성 된 bash
프로세스는 명령 줄 인수로 전달되기 때문에 script.sh
를 해석합니다. script.sh
는 bash
에서 일반 파일로만 읽으며 실행 비트는 필요하지 않습니다.
, 스크립트에 필요한 인터프리터를 모를 수도 있기 때문입니다. 따라서 프로그램 로더가이를 결정하도록하십시오.
댓글
- 실행 비트가 설정되지 않은 경우 "를 수행하여 스크립트를 실행할 수도 있습니다. ./script.sh"
- @Dog 맞습니다. 점은 내장 명령의 바로 가기입니다. ' source ' , 현재 bash 프로세스에서 스크립트를 실행합니다. 따라서 읽을 수있는 비트 만 필요합니다.
- @Dogeatcatworld 사실이지만
. ./script.sh
를 실행하는 것은 동일하지 않습니다. (또는./script.sh
. 스크립트#!/usr/bin/python -V
< newline >print test
. - 스크립트를 소싱하면 대화 형 세션이 오염 될 수 있습니다. 예를 들어 스크립트가 PATH 환경 변수를 변경하면이 변경 사항은 소스 다음에 실행되는 명령에 영향을줍니다. 이 접근 방식은 부작용 (환경 설정 스크립트 등)에 의존하는 상황을 위해 예약되어야합니다. 권한을 변경할 수없는 ' 다른 상황의 경우 shebang 줄에서 명령을 실행하고 스크립트 이름을 따르는 것이 가장 안전한 방법입니다.
- 주의하십시오. , 현재 디렉토리에서 스크립트를 소싱하면 ./ 를 사용할 필요가 없습니다.
. script.sh
라고 말하면됩니다. 그러나 저는 그렇게 호출 할 수없는 스크립트에서.
명령을 사용하지 않는 사람들의 의견에 동의합니다. 스크립트에exit
명령이 포함되어 있고이를 소싱하면 로그 아웃 될 수 있다고 아무도 언급하지 않은 것에 놀랐습니다. 스크립트가cd
를 수행하면 부모 (대화 형) 셸에도 영향을 미치므로 덜 심각한 문제가됩니다.
Answer
bash script.sh
는 bash를 사용하여 직접 스크립트를 호출합니다.
./script.sh
는 shebang #!/bin/bash
를 사용하여 실행 방법을 결정합니다.
정말 알고 싶다면 bash script.sh
which bash
를 사용하면 알 수 있습니다.
예에서는 차이가 없습니다. 예, ./script.sh
를 통해 직접 실행하려면 chmod +x script.sh
가 필요합니다.
댓글
Answer
다음과 같이 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
를 실행할 프로그램을 결정하는 줄입니다.
설명
- +1 좋은 예
Answer
다른 답변 외에도 ./script.sh
(i) 및 소스 ./script.sh
(ii)가 유용합니다.-(i) 버전은 명령을 실행할 새 셸을 만듭니다. (ii) 현재 셸에서 실행합니다. 실행 파일이 종료 된 후 보존해야하는 환경 변수를 실행 파일이 변경하는 경우 필수 일 수 있습니다. 예를 들어, Python conda 환경을 활성화하려면 다음을 사용해야합니다.
source activate my_env
N.B. source
의 또 다른 대안은 .
내장 기능입니다. 즉
. activate my_env
/bin/bash
가 첫 번째bash
$PATH
.#!/bin/bash
는/bin/bash
./script.sh
를 통해 호출하는 경우에만 필요합니다.