Bashでのソーシングとフォークの違いを学ぶ


この記事の主な焦点は、スクリプトを実行した場合とbashでスクリプトをソースした場合に何が起こるかを明確に理解することです。まず、さまざまな方法でスクリプトを呼び出すと、プログラムがどのように送信されるかが明確に理解されます。

注:拡張子を使用してスクリプトを作成することは重要ではありません。スクリプトは拡張機能がなくても正常に実行されます。

基本的に、すべてのスクリプトはシバン(#!)と呼ばれる行で始まります。 bashのハッシュ記号はコメントとして解釈されますが、シバンには特別な意味があります。それはあなたがシバンで言及したどんな通訳でもプログラムを提出するようにbashに伝えます。

以下はサンプルプログラムで、インタプリタとしてbashを指定しています。

$ cat >> Hello_World.sh
#!/usr/bin/env bash
echo "Hello world"

$ chmod +x Hello_world.sh

スクリプトを実行するには、2つの方法で実行できます。

  • Use a relative path to call the script. Move to the directory where the script is present and run ./Hello_world.sh.
  • Use the absolute path to call the script. From anywhere in the file system type the full path to the script.
$ ./Hello_world.sh
$ pwd
$ /home/karthick/Hello_world

それでは、シバンなしでプログラムを送信しようとするとどうなるか見てみましょう。シバンがない場合、プログラムは現在実行しているシェルに送信されます。私の場合は、Bash(/ bin/bash)です。

例を示しましょう。シバンなしで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

スクリプトの一部として複数の子プロセスが存在する可能性があり、それはコードによって異なります。添え字によって作成された環境変数は、終了すると削除されることに注意してください。子プロセスは、親プロセスによって作成された変数をエクスポートすることにより、それらにアクセスできます。ただし、親プロセスは、子プロセスによって作成された変数にアクセスできません。

以下の記事を見て、変数がどのように機能するか、および変数をエクスポートする方法について詳しく理解してください。

スクリプトの調達

「ソース」は、引数として渡されたファイルを読み取り、現在のシェル環境でコードを実行するシェル組み込みコマンドです。主に使用する適切な使用例は、 .bashrc または .bash_profile で構成を変更し、sourceコマンドを使用して変更を再読み込みすることです。

$ type -a source

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

次に、スクリプト内でsourceコマンドを実行して、変数と関数を現在のシェル環境にロードし、「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で非常に役立ちます。コードを小さなモジュールに分割して、多くのプログラムで使用できます。これらの方法で、DRY(Do n’t Repeat Yourself)の原則に従うことができます。

この記事は以上です。 bashでのソーシングとフォークの違いについて簡単に説明しました。記事に目を通し、貴重なフィードバックを私たちと共有してください。