web-dev-qa-db-ja.com

bash script.sh vs ./script.sh vs #shebang

私が今bashシェルにいて、次を実行すると仮定します

[me@server]$ bash script.sh

q1)スクリプトを実行するために新しい子bashプロセスが作成されていますか?

私がするなら

[me@server]$ ./script.sh

q2)スクリプトを実行するために新しい子bashプロセスが作成されていますか?

q3)2つの方法の違いは何ですか?

3
Noob

から ドットスラッシュの説明

あなたがする違いは、

shを使用すると、ターミナルのインタラクティブプロンプトで入力した場合と同じようにinterpret the lines in your scriptするプログラムを実行します。

./を使用すると、スクリプトが現在のディレクトリのちょうどここにあり、実行可能であると想定してショートカットを作成します(たとえば、chmod + x myscript.shを発行したため)。

this 回答からの追加情報:

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

権限要件の違いの理由は、スクリプトを解釈するプログラムがどのようにロードされるかにあります。

./script.shを使用すると、シェルはファイルを通常の実行可能ファイルであるかのように実行します。シェルはそれ自体をフォークし、システムコール(例:execve)を使用して、フォークされたプロセスでオペレーティングシステムにファイルを実行させます。オペレーティングシステムはファイルのパーミッションをチェックし(したがって実行ビットを設定する必要があります)、要求をプログラムローダーに転送します。プログラムローダーはファイルを調べて実行方法を決定します。 Linuxでは、コンパイルされた実行可能ファイルはELFマジックナンバーで始まりますが、スクリプトは#で始まります。 (シバン)。ハッシュバンヘッダーは、ファイルがスクリプトであり、ハッシュバンの後に指定されたプログラムによって解釈される必要があることを意味します。これにより、スクリプト自体がシステムにスクリプトの解釈方法を指示できます。

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

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

  1. 子bashプロセスが作成されます
  2. 上記と同じ(シバンによる)
  3. 子をフォークしたくない場合、またはenv値をscript.shから保持したい場合は、2つは同等です。

    . ./script.sh
    

ただし、注意してください

  • script.shがexitを呼び出すと、現在のシェルを終了します。
  • シェルがエラーなしで終了した場合は、最初のシェルに戻ります。
0
Archemar