BASHプログラミング
 Computer >> コンピューター >  >> プログラミング >> BASHプログラミング

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

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

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

基本的に、すべてのスクリプトは shebang(#!)という行で始まります 。 ハッシュ bashの記号はコメントとして解釈されますが、シバン 特別な意味があります。 shebangで言及したインタプリタでプログラムを送信するように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
Bashでのソーシングとフォークの違いを学ぶ

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

例を示しましょう。 シバンなしでPythonスクリプトを作成しています プログラムを呼び出すと、 bash このプログラムをPythonインタープリターに送信する必要があることを認識していません。代わりに、現在のシェルでプログラムを実行します。

$ cat > run-py.py
echo $SHELL
print("Hello world")

$ chmod +x run-py.py
$ ./run-py.py
Bashでのソーシングとフォークの違いを学ぶ Bashでのソーシングとフォークの違いを学ぶ

この場合、どの通訳者に提出するかを指定するか、シバンを追加するだけで、プログラムを呼び出すことができます。 常に推奨されるライン。

# which python3
$(which python3) /home/karthick/run_py.py
Bashでのソーシングとフォークの違いを学ぶ Bashでのソーシングとフォークの違いを学ぶ

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

$ ps -ef --forest | grep -i bash
Bashでのソーシングとフォークの違いを学ぶ Bashでのソーシングとフォークの違いを学ぶ

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

変数がどのように機能し、変数をエクスポートする方法について詳しくは、以下の記事をご覧ください。

  • シェルスクリプトでの「Linux変数」の理解と記述
  • Bashで$$と$BASHPIDの違いを学ぶ

スクリプトの調達

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

$ type -a source
Bashでのソーシングとフォークの違いを学ぶ

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
Bashでのソーシングとフォークの違いを学ぶ

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

$ bash main.sh
Bashでのソーシングとフォークの違いを学ぶ

次に、スクリプト内で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でのソーシングとフォークの違いを学ぶ

スクリプトをもう一度実行して確認してください。

$ bash main.sh
Bashでのソーシングとフォークの違いを学ぶ

ソース bashで非常に便利です シェルスクリプトを作成する際にモジュラープログラミングアプローチに従うこと。コードを小さなモジュールに分割して、多くのプログラムで使用できます。このようにして、 DRYをフォローできます。 (繰り返さないでください )原則。

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


  1. GoとJavaの違い。

    行く Goは手続き型プログラミング言語です。プログラムはパッケージを使用して組み立てられます。動的言語に似たパターンを採用する環境をサポートします。 Java Javaはオブジェクト指向プログラミング言語です。 Javaは静かで高速、信頼性が高く、安全です。最も広く使用されている言語でもあります。 GoとJavaの重要な違いは次のとおりです。 Sr。いいえ。 キー 移動 Java 1 タイプ Goは手続き型プログラミング言語であり、動的言語と同様のパターンをサポートしています。 Javaはオブジェクト指向プログラミング言語です。 2 クラスのサポート

  2. Bashでの$$と$BASHPIDの違いを学ぶ

    最近、シェルスクリプトに取り組んでいて、bashの特殊変数$に大きな違いが見られました。 およびBASHPID 動作します。 Linuxで実行されているすべてのプロセスには、プロセス IDが割り当てられます。 これが、オペレーティングシステムがプロセスを処理する方法です。 関連記事 :Bashでのソーシングとフォークの違いを学ぶ 同様に、bashターミナルセッションにもプロセスIDが割り当てられます。 $という特別な変数があります および$BASHPID 現在のシェルのプロセスIDを格納します。 先に進み、以下のコマンドを実行して、現在のシェルのプロセスIDを確認します。両方の$ および$