「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ただし、スクリプトにどのインタプリタが必要かわからないため、使用することをお勧めします。したがって、プログラムローダーにこれを決定させるようにしてください。

おすすめ記事