“ bash script.sh ” 및 “ ./ script 실행의 차이점은 무엇입니까? .sh ”?

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.shbash에서 일반 파일로만 읽으며 실행 비트는 필요하지 않습니다.


, 스크립트에 필요한 인터프리터를 모를 수도 있기 때문입니다. 따라서 프로그램 로더가이를 결정하도록하십시오.

댓글

  • 실행 비트가 설정되지 않은 경우 "를 수행하여 스크립트를 실행할 수도 있습니다. ./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가 필요합니다.

댓글

  • 글쎄, /bin/bash가 첫 번째 bash $PATH.
  • 당신이 ' 맞습니다. 그리고 shebang #!/bin/bash/bin/bash
  • Bash (버전 4.2.37)가있는 경우에만 작동합니다. 시스템은 실행 비트 설정 없이도 스크립트를 실행합니다. 실행 비트가 필요한 이유는 무엇입니까?
  • 예, 실행 비트는 ./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 

답글 남기기

이메일 주소를 발행하지 않을 것입니다. 필수 항목은 *(으)로 표시합니다