답변:
당신이 사용하는 경우
sh ./<script>.run
/bin/sh
(보통 Bourne 쉘) 스크립트를 실행하는 데 사용됩니다. 물론 이것은 스크립트가 Bourne 쉘용으로 작성된 경우에만 작동합니다. 때때로 Linux 용 쉘 스크립트에는 Bourne 쉘 대신 Bash가 필요하므로 쉘 스크립트 인 경우에도 작동하지 않을 수 있습니다.
당신이 사용하는 경우
./<script>.run
커널은 shebang 행 을보고 프로그램을 실행하는 데 사용할 프로그램을 찾습니다. 따라서 이것은 Bash, Perl, Python 또는 다른 스크립트 인 경우에도 작동합니다.
따라서 이것은 일반적으로 스크립트를 실행하는 데 선호되는 방법입니다.
만큼 그것의로 sh
(대시, 또는 동급) 쉘 스크립트, 아니, 외부적인 차이가 없습니다.
문제는 .run
그것이 사실임을 보장하지는 않습니다. 이진일 수 있습니다. Bash, Python 또는 PHP 등이 될 수 있습니다. 그들은 모두 쉘 스크립트 해시 뱅을 가지고 있습니다. 당신이 맹목적으로 그것을 통해 강요하면 sh
, 누가 일어날 수 있는지 알고 있습니다. 아마도 오류가 발생하지만 실수로 위험 코드를 실행하여 멀어 질 수 있습니다.
에 의해 chmod
딩이 (실행 권한 비트를 사용하려면) 다음을 실행 ./script.run
, 당신은 그것을 실행하는 최상의 가능성을 제공합니다. 쉘 스크립트 인 경우 해시 뱅이 올바르게 구문 분석되고 바이너리 실행 파일 인 경우 기본적으로 실행됩니다.
두 방법은 종종 동일하게 작동하지만 매우 다릅니다.
sh ./script
실행 sh
인수와 명령 ./script
스크립트가 실제로없는 경우에도 .. 주어진 스크립트를 실행하는 일, sh
스크립트 (나쁜)
./script
주어진 파일을 실행합니다. 실행할 명령을 판별하기 위해 "shebang" 행을 찾아서 이를 수행합니다. 지정되지 않은 경우 사용하지만 sh
(이 두 방법은 때때로 동일하게 작동하지만) 종종 다른 통역사가 지정됩니다.
예를 들어 filename
다음 이 포함 된 경우 :
#!/usr/bin/python
print "This is a Python script!"
두 명령은 매우 다릅니다.
$ sh script
script: line 3: print: command not found
$ chmod +x script
$ ./script
This is a Python script!
shebang 라인이 없으면 두 개는 동일합니다.
$ cat script
echo "This is an sh script"
$ sh ./script
This is an sh script
$ ./script
This is an sh script
한 가지 중요한 차이점은 해시 뱅 라인에 매개 변수가있는 경우입니다. 예를 들어, 스크립트가
#!/bin/bash -e
... 그리고 당신은 외부 사용하여 실행 sh
또는 bash
그렇게, 그 라인은 주석으로 해석되며 무시됩니다, -e
매개 변수 (실패 출구가) 처리되지 않습니다. 따라서 다음 스크립트가 주어집니다.
#!/bin/bash -e
echo Hello
false
echo goodbye
의 출력이 ./script
됩니다 그냥 "안녕하세요",하지만에 대한 출력 sh script
됩니다 Hello
다음에 goodbye
아마 의도되지 않은.
set -e
그건 그렇고, 항상 별도의 진술을 사용해야하는 이유입니다 (어쨌든 스크립트 중반에 문제가있는 경우 무시하지 않으려는 경우가 아닙니다).