ウェブサイト検索

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 の $$と $BASPID の違いを学ぶ

スクリプトの入手

ソース 」は、引数として渡されたファイルを読み取り、現在のシェル環境でコードを実行するシェル組み込みコマンドです。主に使用する適切なユースケースは、.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 におけるソーシングとフォークの違いについて簡単に説明しました。記事を読んで、貴重なフィードバックを私たちと共有してください。