Script.shが通常のようなものである場合
#!/bin/bash
echo "Hello World!"
スクリプトを実行する好ましい方法はありますか?最初にchmodして実行可能にする必要があると思いますか?
特定のスクリプトでは、./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.sh
はbash
によって通常のファイルとしてのみ読み取られるため、実行ビットは必要ありません。
ただし、./script.sh
を使用することをお勧めします。スクリプトに必要なインタープリターがわからない場合があるためです。そのため、プログラムローダーに判断させてください。
bash script.sh
は、bashを使用して直接スクリプトを呼び出します。./script.sh
はシバンを使用しています#!/bin/bash
実行方法を決定します。
本当に知りたい場合は、bash script.sh
which bash
。
したがって、あなたの例では違いはありません。はい、あなたはchmod +x script.sh
を介して直接実行できるようにする./script.sh
。
次のように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
を実行するプログラムを決定する行。他の回答に加えて、./script.sh
(i)とソース./script.sh
(ii)を介したスクリプトの実行の違いを知ることは有用です-(i)バージョンは、実行する新しいシェルを作成します一方、(ii)現在のシェルでそれを実行します-実行可能ファイルが、実行可能ファイルの終了後に保持する必要がある環境変数を変更する場合は、必須にすることができます。たとえば、python conda環境をアクティブにするには、以下を使用する必要があります。
source activate my_env
N.B.遭遇する可能性のあるsource
の別の代替手段は、.
ビルトインです。
. activate my_env