次の例では、プロセスIDを含む一重引用符と二重引用符に何が起こっているのかを正確に説明できる人はいますか? [コピー]

次の例では、プロセスIDを含む一重引用符と二重引用符に何が起こっているのかを正確に説明できる人はいますか? [コピー]
[root@localhost ~]# echo $$
16991
[root@localhost ~]# bash -c "echo $$"
16991
[root@localhost ~]# bash -c "echo $$"
16991
[root@localhost ~]# bash -c 'echo $$'
21062
[root@localhost ~]# bash -c 'echo $$'
21063
[root@localhost ~]# bash -c 'echo $$'
21064
[root@localhost ~]# bash -c "echo $$"
16991

私が知る限り、一重引用符を使用するたびに新しいサブシェルが作成され、二重引用符では同じことは発生しません。なぜですか?

答え1

要約: シェルは二重引用符で囲まれた文字列に対してパラメータ置換を実行しますが、いいえ一重引用符で囲まれた文字列。 $$はシェルPIDですが、表示される番号は次のように異なります。どのシェルがこれを評価します。

詳細: それぞれの状況を一度に一つずつ考えてみましょう。

[root@localhost ~]# echo $$
16991

16991は現在のシェルのPIDです。これをメインシェルと呼びます。

[root@localhost ~]# bash -c "echo $$"
16991

メインシェルでこれを検出すると、"echo $$"16991に置き換えられます$$。したがって、渡された文字列bash -cはですecho 16991。これが16991が印刷される理由です。

[root@localhost ~]# bash -c 'echo $$'
21062

一重引用符のため、'echo $$'デフォルトのシェルはパラメータ置換を実行しません。文字列は.21062echo $$に渡され、bash -cプロセスのPIDなので印刷されますbash -c

[root@localhost ~]# bash -c 'echo $$'
21063

次にbash -cプロセスが実行されると、今回は21063という新しいPIDがあります。

答え2

一重引用符は強い引用符であり、bashはこれを二重引用符などの文字列ではなく引数として読み込みます。 -c オプションを使用して bash を呼び出すと、文字列以外の引数を位置引数として使用するように指示します。一重引用符は文字列ではないため、位置ステートメントとして解釈する必要があります。

http://tldp.org/LDP/abs/html/bash-options.html

関連情報