web-dev-qa-db-ja.com

「bash script.sh」と「./script.sh」の実行の違いは何ですか?

Script.shが通常のようなものである場合

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

スクリプトを実行する好ましい方法はありますか?最初にchmodして実行可能にする必要があると思いますか?

43
user72136

特定のスクリプトでは、./script.shが実行と読み取り可能なビットを必要とし、bash script.shが読み取り可能なビットのみを必要とすることを除いて、どちらの方法でも機能します。


権限要件の違いの理由は、スクリプトを解釈するプログラムのロード方法にあります。

  • ./script.shは、通常の実行可能ファイルのようにファイルをシェルに実行させます。

シェルは自身をforkし、システムコール(execveなど)を使用して、forkされたプロセスでオペレーティングシステムにファイルを実行させます。オペレーティングシステムはファイルの権限をチェックし(実行ビットを設定する必要があります)、要求を プログラムローダー に転送します。これにより、ファイルが確認され、実行方法が決定されます。 Linuxでは、コンパイルされた実行可能ファイルは [〜#〜] elf [〜#〜] マジック番号で始まりますが、スクリプトは#!hashbang )で始まります。ハッシュバンヘッダーは、ファイルがスクリプトであり、ハッシュバンの後に指定されたプログラムによって解釈される必要があることを意味します。これにより、スクリプト自体がシステムにスクリプトの解釈方法を伝えることができます。

スクリプトを使用すると、プログラムローダーは/bin/bashを実行し、コマンドライン引数として./script.shを渡します。

  • bash script.shは、シェルをbashで実行し、script.shをコマンドライン引数として渡します

したがって、オペレーティングシステムはbashをロードします(script.shはコマンドライン引数にすぎないため、これも表示しません)。作成されたbashプロセスは、コマンドライン引数として渡されるため、script.shを解釈します。 script.shbashによって通常のファイルとしてのみ読み取られるため、実行ビットは必要ありません。


ただし、./script.shを使用することをお勧めします。スクリプトに必要なインタープリターがわからない場合があるためです。そのため、プログラムローダーに判断させてください。

57
hellodanylo

bash script.shは、bashを使用して直接スクリプトを呼び出します。
./script.shはシバンを使用しています#!/bin/bash実行方法を決定します。

本当に知りたい場合は、bash script.shwhich bash

したがって、あなたの例では違いはありません。はい、あなたはchmod +x script.shを介して直接実行できるようにする./script.sh

18
xx4h

次のように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を実行するプログラムを決定する行。
4
David

他の回答に加えて、./script.sh(i)とソース./script.sh(ii)を介したスクリプトの実行の違いを知ることは有用です-(i)バージョンは、実行する新しいシェルを作成します一方、(ii)現在のシェルでそれを実行します-実行可能ファイルが、実行可能ファイルの終了後に保持する必要がある環境変数を変更する場合は、必須にすることができます。たとえば、python conda環境をアクティブにするには、以下を使用する必要があります。

source activate my_env

N.B.遭遇する可能性のあるsourceの別の代替手段は、.ビルトインです。

. activate my_env
1
einonm