bash
でecho $$
を実行すると7190
のような数値が返されるのに、echo $
を実行すると$
のみが返されるのはなぜですか?
コンベンション。
$$
:シェルのプロセスIDに展開します。 ()サブシェルでは、サブシェルではなく、呼び出し元のシェルのプロセスIDに展開されます(以下のマニュアルへのリンクを参照)。
rinzwind@schijfwereld:~$ echo $$
3244
rinzwind@schijfwereld:~$ ps -ef |grep 3244
rinzwind 3244 3237 0 19:06 pts/0 00:00:00 /bin/bash
ソフトウェアをコーディングするときに非常に便利です。そして、一時ファイルを作成する粗雑な(mktemp
の方が良い方法です)方法として使用できます。
1 $
には特別な意味はないので、echoが常に行うことを返します。
マニュアルページ があります(3.4.2特殊パラメーター)。
Bashでは、変数を使用して$
を使用し、最初のドル記号で$$
を使用して、変数を使用し、2番目の変数を使用してその変数の名前を伝えます実際は$
です。実際には命名規則であり、この変数には現在のシェルのプロセスIDが含まれています。
$$$$
のコメントで尋ねたように、同じプロセスIDを2回返しています。
他の変数もあります(From here ):
$1
、$2
、$3
、...は 位置パラメーター です。"$@"
は、すべての定位置パラメーター{$1, $2, $3 ...}
の配列のような構造です。"$*"
は、すべての定位置パラメーター$1 $2 $3 ...
のIFS拡張です。$#
は定位置パラメーターの数です。$-
現在のシェルのオプションセット。$$
現在のシェル(サブシェルではない)のpid。$_
最新のパラメーター(または、起動直後に現在のシェルを起動するコマンドのabsパス)。$IFS
は(入力)フィールド区切り文字です。$?
は、最新のフォアグラウンドパイプラインの終了ステータスです。$!
は、最新のバックグラウンドコマンドのPIDです。$0
は、シェルまたはシェルスクリプトの名前です。
以下は、 Lock Screen Timer から取得した$$
の実際のアプリケーションです。
# Check if lock screen timer already running
pID=$(pgrep -f "${0##*/}") # All PIDs matching lock-screen-timer name
PREVIOUS=$(echo "$pID" | grep -v ^"$$") # Strip out this running copy ($$$)
if [ "$PREVIOUS" != "" ]; then
kill "$PREVIOUS"
rm ~/.lock-screen-timer-remaining
zenity --info --title="Lock screen timer already running" --text="Previous lock screen timer has been terminated."
fi
このコードでは、次の行を抜粋しています。
PREVIOUS=$(echo "$pID" | grep -v ^"$$") # Strip out this running copy
現在実行中のプロセス($$
)を使用して、同じ名前(この場合は-v
)で実行されているすべてのプロセスのリストから(lock-screen-timer
ではなく)削除します。
以前に実行中のコピーがあった場合、コードはそれを強制終了し、使用していたワークファイルを削除します。