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

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

script.shが次のような一般的なものである場合

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

スクリプトを実行するための好ましい方法はありますか?実行できるようにまずchmodを実行する必要があると思いますか?

答え1

特定のスクリプトでは./script.sh、実行可能で読み取り可能なビットとbash script.sh読み取り可能なビットのみが必要であることを除いて、両方のアプローチが機能します。


権限要件が異なる理由は、スクリプトを解釈するプログラムがロードされる方法です。

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

シェルはそれ自体でフォークを実行し、システムコール(たとえばexecve)を使用して、オペレーティングシステムにフォークされたプロセスでファイルを実行させます。オペレーティングシステムはファイルの権限を確認し(したがって実行ビットを設定する必要があります)、要求を次に転送します。プログラムローダー、ファイルを表示して実行する方法を決定します。 Linuxでコンパイルされた実行可能ファイルは次のように始まります。非常に低い周波数マジックナンバー、#!マジックナンバーを含むスクリプト、(ハッシュスティック)。 hashbangヘッダーは、ファイルがスクリプトであり、hashbangの後に指定されたプログラムによって解釈される必要があることを意味します。これにより、スクリプト自体がシステムにスクリプトの解釈方法を伝えることができます。

スクリプトの場合、プログラムローダが実行され、/bin/bashコマンドライン引数として渡されます。./script.sh

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

したがって、OSがロードされます(単純なコマンドライン引数であるため、bash見ていません)。script.sh生成されたプロセスは、コマンドライン引数として渡されたかのようにbash解釈されます。通常のファイルでのみ読み取るscript.shため、実行ビットは不要です。script.shbash


./script.shただし、スクリプトにどのインタプリタが必要かわからないため、使用することをお勧めします。したがって、プログラムローダーにこれを決定させるようにしてください。

答え2

bash script.shbashを使用してスクリプトを直接呼び出します。
./script.shShebangは#!/bin/bash実行方法を決定するために使用されます。

bash script.shどのバイナリが実行されるのか本当に知りたい場合はwhich bash

したがって、あなたのケースに違いはありません。はい、chmod +x script.sh直接通過する必要があります./script.sh

答え3

次のように Delete_Self.sh ファイルを生成します。

 #!/bin/rm

 echo I am still here!

このスクリプトを実行すると、sh Delete_Self.sh「まだここにいます!」というメッセージが表示されます。

実行可能にしてから実行すると、./Delete_Self.shエコーがなく、ファイルDelete_Self.sh自体が消えることがわかります。

違いは次のとおりです。

  • bash script.shscript.shを実行するプログラムとしてbashが指定されているので#!行は無視されます。
  • ./script.sh#!行を読み取って実行するプログラムを決定しますscript.sh

答え4

他の答えに加えて、./script.sh(i)とsource ./script.sh(ii)を介してスクリプトを実行することの違いを知っておくと便利です。 - (i) バージョンはコマンドを実行するための新しいシェルを生成し、(ii) は現在のシェルで実行します。 - if実行可能ファイルが終了した後に保持する必要がある環境変数を実行可能ファイルが変更した場合は、コマンドが必須になる可能性があります。たとえば、Python conda 環境を有効にするには、次のコマンドを使用する必要があります。

source activate my_env

source発生する可能性がある別のオプションが組み込ま.れています。

. activate my_env

関連情報