[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 を呼び出すと、文字列以外の引数を位置引数として使用するように指示します。一重引用符は文字列ではないため、位置ステートメントとして解釈する必要があります。