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


42

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

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

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

답변:


56

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


3
실행 비트가 설정되지 않은 경우 ". ./script.sh"를 수행하여 스크립트를 실행할 수도 있습니다.
Dog eat cat world

1
@Dog 당신이 맞습니다. 점은 현재 bash 프로세스에서 스크립트를 실행하는 내장 명령 'source'의 바로 가기입니다. 따라서 읽을 수있는 비트 만 필요합니다.
SkyDan

5
@Dogeatcatworld는 사실이지만 실행 . ./script.shbash script.sh(또는 ./script.sh. #!/usr/bin/python -V<newline> 스크립트를 고려하십시오 print test.
casey

12
스크립트를 소싱하면 대화식 세션이 오염 될 수 있습니다. 예를 들어, 스크립트가 PATH 환경 변수를 변경하면이 변경은 소스 다음에 실행되는 명령에 영향을줍니다. 이 접근 방식은 실제로 부작용 (환경 설정 스크립트 등)에 의존하는 상황에 대비해야합니다. 권한을 변경할 수없는 다른 상황에서는 스크립트 이름 뒤에 shebang 행에서 명령을 실행하는 것이 가장 안전한 방법입니다.
ctt

6
현재 디렉토리에서 스크립트를 소싱하는 경우 ./ ; 를 사용할 필요가 없습니다 . 그냥 말해 . script.sh. 그러나 나는 .그런 식으로 호출되지 않은 스크립트 에서 명령을 사용하지 않는 사람들에 동의합니다 . 스크립트에 exit명령이 포함되어 있고 소스를 제공하면 로그 아웃 할 수 있다고 언급 한 사람이 아무도 없습니다 . 스크립트가를 수행하는 경우 덜 심각한 문제는 cd부모 (대화식) 셸에도 영향을 미치기 때문입니다.
Scott

18

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

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

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


2
글쎄, 그 가정에는 차이가 있습니다 /bin/bash첫 번째 없다 bash당신에서 $PATH.
CJM

네가 옳아. 그리고 shebang #!/bin/bash/bin/bash
xx4h

시스템의 Bash (버전 4.2.37)는 실행 비트가 설정되지 않은 경우에도 스크립트를 실행합니다. 왜 실행 비트가 필요하다고 말합니까?
SkyDan

예, 실행 비트는을 통해 호출해야합니다 ./script.sh.
xx4h

4

다음과 같이 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
ThisaruG

1

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

source activate my_env

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

. activate my_env
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.