回答:
使用する場合
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
、あなたはそれを実行しているの最善の可能性を与えます。シェルスクリプトの場合、そのハッシュバンは適切に解析され、バイナリ実行可能ファイルの場合、ネイティブに実行されます。
多くの場合、2つの方法は同じように機能しますが、非常に異なります。
sh ./script
sh
引数付きでコマンドを実行します./script
を実行します。これれたスクリプトが実行されます。sh
(不良)
./script
指定されたファイルを実行します。これは、を実行するに「shebang」行をて実行するコマンドを決定します。指定されていない場合はsh
(この2つの方法は同じように動作する場合があります)、異なるインタープリターが指定されることがよくあります。
たとえばfilename
、次が含まれている場合:
#!/usr/bin/python
print "This is a Python script!"
..その後、2つのコマンドは大きく異なります。
$ sh script
script: line 3: print: command not found
$ chmod +x script
$ ./script
This is a Python script!
シバンラインがない場合、2つは同じです。
$ cat script
echo "This is an sh script"
$ sh ./script
This is an sh script
$ ./script
This is an sh script
重要な違いの1つは、hashbang行にパラメーターがある場合です。たとえば、スクリプトが次で始まる場合
#!/bin/bash -e
...また、sh
またはを使用して外部で実行するとbash
、その行はコメントとして解釈され無視されるため、-e
パラメーター(失敗時に終了)は処理されません。したがって、次のスクリプトを考えます:
#!/bin/bash -e
echo Hello
false
echo goodbye
の出力は./script
"Hello"になりますが、の出力にsh script
はがHello
続きますがgoodbye
、これはおそらく意図していなかったでしょう。
ちなみに、これは常に別のset -e
ステートメントを使用する必要がある理由です(とにかく良いアイデアです-たいていの場合、問題がスクリプトの途中にある場合、無視したくないでしょう)。