Bash のソーシングとフォークの違いを学ぶ
この記事の主な焦点は、bash でスクリプトのソースとソースを実行すると何が起こるかを明確に理解することです。まず、さまざまな方法でスクリプトを呼び出したときにプログラムがどのように送信されるかを明確に理解します。
注: 拡張子を付けてスクリプトを作成しても問題はありません。スクリプトは拡張機能なしでも正常に実行されます。
基本的に、すべてのスクリプトはシェバン(#!)と呼ばれる行で始まります。 bash のハッシュ シンボルはコメントとして解釈されますが、 シバン には特別な意味があります。これは bash に、シバンで述べたインタープリタでプログラムを送信するように指示します。
以下はサンプルプログラムで、インタープリタとして bash を指定しています。
$ cat >> Hello_World.sh #!/usr/bin/env bash echo "Hello world" $ chmod +x Hello_world.sh
ここでスクリプトを実行するには、2 つの方法があります。
- 相対パスを使用してスクリプトを呼び出します。スクリプトが存在するディレクトリに移動し、./Hello_world.sh を実行します。
- 絶対パスを使用してスクリプトを呼び出します。ファイル システム内の任意の場所から、スクリプトへのフルパスを入力します。
$ ./Hello_world.sh $ pwd $ /home/karthick/Hello_world

ここで、シバンを行わずにプログラムを送信しようとすると何が起こるかを見てみましょう。 shebang がない場合、プログラムは現在実行しているシェルに送信されます。私の場合は、Bash です (/bin/bash)。
例を示しましょう。 shebang を使用せずに Python スクリプトを作成していますが、プログラムを呼び出すと、bash はこのプログラムを Python インタープリターに送信する必要があることを認識せず、代わりにプログラムを実行します。現在のシェルで。
$ cat > run-py.py echo $SHELL print("Hello world") $ chmod +x run-py.py $ ./run-py.py

この場合、どのインタプリタに送信するかを指定してプログラムを呼び出すことも、常に推奨されるシバン行を追加することもできます。
# which python3 $(which python3) /home/karthick/run_py.py

スクリプトの呼び出し方法がわかったので、次のステップは、スクリプトを呼び出したときに何が起こるかを理解することです。上記の例に示すようにスクリプトを呼び出すと、子プロセスが作成され (フォーク)、スクリプトが子プロセスに送信されます。次のコマンドを実行するだけのサンプル スクリプトを実行し、スクリプトが子プロセスに送信されることを示しました。
$ ps -ef --forest | grep -i bash

スクリプトの一部として複数の子プロセスが存在する可能性があり、それはコードによって異なります。サブスクリプトによって作成された環境変数は、終了すると削除されることに注意してください。子プロセスは、親プロセスによって作成された変数をエクスポートすることで、変数にアクセスできます。ただし、親プロセスは、子プロセスによって作成された変数にアクセスできません。
変数の仕組みと変数のエクスポート方法について詳しくは、以下の記事を参照してください。
- シェル スクリプトでの「Linux 変数」の理解と記述
- Bash の $$と $BASHPID の違いを学ぶ
スクリプトの入手
「ソース」は、引数として渡されたファイルを読み取り、現在のシェル環境でコードを実行するシェル組み込みコマンドです。主に使用する適切なユースケースは、構成の変更です。 .bashrc
または .bash_profile
で、source コマンド を使用して変更をリロードします。
$ type -a source

ソース コマンドを実行するには 2 つの構文方法があります。 2 つの構文から任意の構文を選択でき、それは個人的な選択です。
$ source FILE_NAME [ARGUMENTS] $ . FILE_NAME [ARGUMENTS]
ソースが実際にどのように機能するかを示してみましょう。シェルスクリプトを2つ作成します。最初のスクリプト (Module.sh) には、いくつかの変数と関数が含まれます。 2 番目のスクリプト (Main.sh) は変数を出力し、関数を呼び出します。
Module.sh ファイルを作成します。
#!/usr/bin/env bash VAR1=$(echo "Welcome to $1") function f1(){ echo “Function f1 is called” }
ファイルMain.sh 。
#!/usr/bin/env bash echo $VAR1 f1

スクリプトの実行権限を設定し、メイン スクリプト \main.sh を呼び出します。ここで、このスクリプトは関数 f1
と変数 VAR1 を見つけようとします。
は現在のシェル環境では実行されず、コマンドが見つからないというエラーで失敗します。
$ bash main.sh

次に、スクリプト内でソース コマンドを実行しましょう。これにより変数と関数が現在のシェル環境にロードされ、\main.sh からアクセスできるようになります。
Module.sh ファイルを作成します。
#!/usr/bin/env bash VAR1=$(echo "Welcome to $1") function f1(){ echo "Function f1 is called" }
ファイルMain.sh 。
#!/usr/bin/env bash source module.sh Tecmint echo $VAR1 f1

ここでスクリプトを再度実行して確認してください。
$ bash main.sh

このソースはbashでモジュール式プログラミングアプローチに従ってシェルスクリプトを作成するのに非常に役立ちます。コードを小さなモジュールに分割し、多くのプログラムで使用できます。このようにして、 私たちはドライ (同じことを繰り返さない) 原則に従うことができます。
この記事はここまでです。 bash におけるソーシングとフォークの違いについて簡単に説明しました。記事を読んで、貴重なフィードバックを私たちと共有してください。