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

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

最近、シェルスクリプトに取り組んでいて、bashの特殊変数$に大きな違いが見られました。 およびBASHPID 動作します。 Linuxで実行されているすべてのプロセスには、プロセス IDが割り当てられます。 これが、オペレーティングシステムがプロセスを処理する方法です。

関連記事 :Bashでのソーシングとフォークの違いを学ぶ

同様に、bashターミナルセッションにもプロセスIDが割り当てられます。 "$"という特別な変数があります および"$BASHPID" 現在のシェルのプロセスIDを格納します。

先に進み、以下のコマンドを実行して、現在のシェルのプロセスIDを確認します。両方の"$" および"$BASHPID" 同じ値を返します。

$ echo $$               # Printing special variable $
$ echo $BASHPID         # Printing the varibale $BASHPID
Bashでの$$と$BASHPIDの違いを学ぶ

bashでは、シェルから外部プログラムを呼び出すと、子プロセス/サブシェルが作成され、プログラムは子プロセスでのみ送信されます。 「sample.sh」というスクリプトに簡単なプロセス監視コマンドを挿入した以下の例を参照してください。 親シェルがプログラムを実行するためのサブシェルを作成する方法を示すため。

#!/usr/bin/env bash

ps -ef --forest | grep -i bash

このスクリプトを実行すると、bashのプロセスIDを取得できます。下の画像から、スクリプトを呼び出したときにbashが子プロセスを作成し、スクリプトを実行したことがわかります。

$ ./sample.sh
Bashでの$$と$BASHPIDの違いを学ぶ Bashでの$$と$BASHPIDの違いを学ぶ

それでは、両方の"$"を使用しましょう および"$BASHPID" スクリプト内で、何が返されるかを確認してください。

#!/usr/bin/env bash
echo "============================"
ps -ef --forest | grep -i bash
echo "============================"
echo "PID USING $ FOR SCRIPT $0 ==> $$"
echo "PID USING BASHPID FOR SCRIPT $0 ==> $BASHPID"
echo

次に、スクリプトを再度実行します。

$ ./sample.sh
Bashでの$$と$BASHPIDの違いを学ぶ Bashでの$$と$BASHPIDの違いを学ぶ

了解しました。同じプロセスIDを返します。これが実際の違いです。 parentheses()内でコマンドを実行して、スクリプト内に別の子プロセスを作成しましょう。 。

# STORING THE PID INTO A VARIABLE…

VAR_HASH=$(echo $$)
VAR_BASHPID=$(echo $BASHPID)

echo "VALUE OF VAR_HASH ==> $VAR_HASH"
echo "VALUE OF VAR_BASHPID ==> $VAR_BASHPID"
Bashでの$$と$BASHPIDの違いを学ぶ Bashでの$$と$BASHPIDの違いを学ぶ

bashでは、括弧 子プロセスを呼び出し、括弧内にあるものはすべて実行します。その場合、両方の$ および$BASHPID 新しい子プロセスIDを保存する必要があります。ただし、上の画像から、$との違いがわかります。 店舗382 これは親IDです(スクリプト sample.shのプロセスID )、および$BASHPID 括弧で作成された作成済みの子プロセスIDを格納します。

それでは、この動作を理解してみましょう。マニュアルページの内容を確認します。

$ man bash
Bashでの$$と$BASHPIDの違いを学ぶ Bashでの$$と$BASHPIDの違いを学ぶ Bashでの$$と$BASHPIDの違いを学ぶ Bashでの$$と$BASHPIDの違いを学ぶ

$を使用する場合 、サブシェルでも、作成元の親プロセスのプロセスIDを格納します。ただし、BASHPID 現在のプロセスIDを保存します。つまり、括弧内に呼び出されると、子プロセスIDが保存されます。

変数$を割り当てたり変更したりすることはできません 、ただしBASHPID 再割り当ては可能ですが、効果はありません。

$ $=10
$ BASHPID=10
$ echo $BASHPID
Bashでの$$と$BASHPIDの違いを学ぶ

BASHPIDの設定を解除することができます 。設定を解除すると、特別な状態が失われ、これを通常の変数として使用できるようになります。

$ unset BASHPID
$ echo $BASHPID
$ BASHPID="Tecmint"
$ echo $BASHPID
Bashでの$$と$BASHPIDの違いを学ぶ

シェルのプロセスIDを割り当てようとしても、シェルはすでに特別な状態を失っているため、ユーザー定義変数として扱われます。

$ BASHPID=$(echo $$)
$ echo $$;echo $BASHPID
Bashでの$$と$BASHPIDの違いを学ぶ

この場合、 BASHPIDの新しいターミナルセッションを使用する必要があります 特別な状態を取得します。

この記事は以上です。 $の違いを見てきました およびBASHPID そして、この記事でそれらがどのように動作するか。この記事に目を通し、貴重なフィードバックを私たちと共有してください。


  1. PythonとBashの違い

    Python Pythonは、実装が簡単で理解しやすいように設計されたプログラミング言語です。動的に型付けされた言語です。ポインタを使用していません。 バッシュ Bashはコマンドラインインタープリターであり、LinuxおよびMacOSオペレーティングシステムにデフォルトで出荷されます。他のオペレーティングシステムにもインストールできます。 LinuxおよびMacOSのデフォルトのユーザーシェルです。 以下は、PythonとBashの重要な違いの一部です。 Sr。いいえ。 キー Python バッシュ 1 タイプ Pythonは、主に自動化プログラミングで使用さ

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

    この記事の主な焦点は、スクリプトとソースを実行したときに何が起こるかを明確に理解することです。 bashのスクリプト。まず、さまざまな方法でスクリプトを呼び出すと、プログラムがどのように送信されるかが明確に理解されます。 注 :拡張子を付けてスクリプトを作成することは重要ではありません。スクリプトは拡張機能がなくても正常に実行されます。 基本的に、すべてのスクリプトは shebang(#!)という行で始まります 。 ハッシュ bashの記号はコメントとして解釈されますが、シバン 特別な意味があります。 shebangで言及したインタプリタでプログラムを送信するようにbashに指示します