+ 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答えに言ったように:私は、私はそのおそらく罰金、病気に待機してシェバングその/ビン/ shを実行し、誰もが、他の情報を持っているかどうかを確認してから答えを受け入れる実行ファイルを確認
user36976

7

sh(ダッシュ、または同等の)シェルスクリプトである限り、いいえ、外見上の違いはありません。

問題は、.runそうであることを保証するものではありません。バイナリにすることもできます。それは、Bash、Python、またはPHPなどです。それらはすべてシェルスクリプトハッシュバンを持っています。あなたが盲目的にそれを無理やり押し通すとsh、誰が何が起こるかを知っています。おそらくエラーアウトになりますが、そこまで行く前に誤って有害なコードを実行する可能性があります。

chmod鼎それが(実行許可ビットを有効にする)し、それを実行している./script.run、あなたはそれを実行しているの最善の可能性を与えます。シェルスクリプトの場合、そのハッシュバンは適切に解析され、バイナリ実行可能ファイルの場合、ネイティブに実行されます。


ああ答えのためのおかげで、私はその罰金だと思うので、実行ファイルは、私がある/ binに/ shのハッシュ強打を実行して確認することを知らなかった
user36976

1

多くの場合、2つの方法は同じように機能しますが、非常に異なります。

sh ./scriptsh引数付きでコマンドを実行します./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

重要な違いの1つは、hashbang行にパラメーターがある場合です。たとえば、スクリプトが次で始まる場合

#!/bin/bash -e

...また、shまたはを使用して外部で実行するとbash、その行はコメントとして解釈され無視されるため、-eパラメーター(失敗時に終了)は処理されません。したがって、次のスクリプトを考えます:

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

の出力は./script"Hello"になりますが、の出力に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.