+ x와 ./ <script>와 sh ./ <script>의 차이점


13

스크립트를 실행하는 것 사이에 실제 차이점이 있습니까?

[sudo] sh ./<script>.run

대신에

[sudo] chmod +x ./<script>.run
[sudo] ./<script>.run

답변:


18

당신이 사용하는 경우

sh ./<script>.run

/bin/sh(보통 Bourne 쉘) 스크립트를 실행하는 데 사용됩니다. 물론 이것은 스크립트가 Bourne 쉘용으로 작성된 경우에만 작동합니다. 때때로 Linux 용 쉘 스크립트에는 Bourne 쉘 대신 Bash가 필요하므로 쉘 스크립트 인 경우에도 작동하지 않을 수 있습니다.

당신이 사용하는 경우

./<script>.run

커널은 shebang 행 을보고 프로그램을 실행하는 데 사용할 프로그램을 찾습니다. 따라서 이것은 Bash, Perl, Python 또는 다른 스크립트 인 경우에도 작동합니다.

따라서 이것은 일반적으로 스크립트를 실행하는 데 선호되는 방법입니다.


1
내가 olis 분 대답에 말했듯이 : 나는 그것의 아마 좋은, 나쁜 대기하도록 오두막의 / 빈 / 쉬를 실행 한 사람이 다른 정보를 가지고 다음 답변 동의 있는지 실행 확인
user36976

7

만큼 그것의로 sh(대시, 또는 동급) 쉘 스크립트, 아니, 외부적인 차이가 없습니다.

문제는 .run그것이 사실임을 보장하지는 않습니다. 이진일 수 있습니다. Bash, Python 또는 PHP 등이 될 수 있습니다. 그들은 모두 쉘 스크립트 해시 뱅을 가지고 있습니다. 당신이 맹목적으로 그것을 통해 강요하면 sh, 누가 일어날 수 있는지 알고 있습니다. 아마도 오류가 발생하지만 실수로 위험 코드를 실행하여 멀어 질 수 있습니다.

에 의해 chmod딩이 (실행 권한 비트를 사용하려면) 다음을 실행 ./script.run, 당신은 그것을 실행하는 최상의 가능성을 제공합니다. 쉘 스크립트 인 경우 해시 뱅이 올바르게 구문 분석되고 바이너리 실행 파일 인 경우 기본적으로 실행됩니다.


아 대답을 주셔서 감사합니다, 그냥 해시 뱅 실행 / bin / sh 실행 파일을 확인 그래서 잘 생각합니다
user36976

1

두 방법은 종종 동일하게 작동하지만 매우 다릅니다.

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

1

한 가지 중요한 차이점은 해시 뱅 라인에 매개 변수가있는 경우입니다. 예를 들어, 스크립트가

#!/bin/bash -e

... 그리고 당신은 외부 사용하여 실행 sh또는 bash그렇게, 그 라인은 주석으로 해석되며 무시됩니다, -e매개 변수 (실패 출구가) 처리되지 않습니다. 따라서 다음 스크립트가 주어집니다.

#!/bin/bash -e
echo Hello
false
echo goodbye

의 출력이 ./script됩니다 그냥 "안녕하세요",하지만에 대한 출력 sh script됩니다 Hello다음에 goodbye아마 의도되지 않은.

set -e그건 그렇고, 항상 별도의 진술을 사용해야하는 이유입니다 (어쨌든 스크립트 중반에 문제가있는 경우 무시하지 않으려는 경우가 아닙니다).


0

아니

[sudo] chmod +x ./<scrupt>.run로 실행할 수 있도록 스크립트를 실행 가능하게 만듭니다 ./<script>.run.
으로 [sudo] sh ./<script>.run당신은 그것을 실행할 수없는 경우에도 실행할 수 있습니다.

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