“bash script.sh”와“./script.sh”실행의 차이점은 무엇입니까? script.sh가 다음과 같은 전형적인 경우 #!/bin/bash echo

script.sh가 다음과 같은 전형적인 경우

#!/bin/bash
echo "Hello World!"

스크립트를 실행하는 기본 방법이 있습니까? 먼저 chmod해야 실행 파일이 될 수 있다고 생각합니까?



답변

./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스크립트에 어떤 인터프리터가 필요한지 알 수 없으므로 그래도 사용하는 것이 좋습니다 . 따라서 프로그램 로더가이를 결정하게하십시오.


답변

bash script.shbash를 사용하여 스크립트를 직접 호출합니다. 실행 방법을 결정하기 위해
./script.shshebang #!/bin/bash을 사용하고 있습니다.

당신이 정말로 알고 싶다면, 당신이 할 경우 어떤 바이너리가 실행되는지 알 수 bash script.sh있습니다 which bash.

따라서 귀하의 예에서는 차이가 없습니다. 예,를 chmod +x script.sh통해 직접 실행할 수 있어야합니다 ./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.

답변

다른 답변 외에도 ./script.sh(i)와 소스 ./script.sh(ii) 를 통해 스크립트를 실행하는 것의 차이점을 아는 것이 유용합니다. (i) 버전은 명령을 실행할 새 셸을 만들고 (ii) 현재 쉘-실행 파일이 종료 된 후 보존해야하는 환경 변수를 실행 파일이 변경하는 경우 필수 일 수 있습니다. 예를 들어, 파이썬 콘다 환경을 활성화하려면 다음을 사용해야합니다.

source activate my_env

NB source발생할 수있는 또 다른 대안 은 .내장입니다.

. activate my_env


답변