コマンド置換による割り当てに二重引用符を入れ子にする

コマンド置換による割り当てに二重引用符を入れ子にする

スタックオーバーフロー回答3.5K以上のテーブルを取得した人は、この1行を使用してDIR現在のbashスクリプトのディレクトリを割り当てました。

DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"

入れ子になった二重引用符が混乱しています。私が知っている限り、次のスニペットは二重引用符で囲まれています。

"$( cd "
"${BASH_SOURCE[0]}"
" && pwd )"

=...(つまりand)$( dirname右側の他のすべての項目は)引用されません。つまり、2番目、4番目、6番目の"文字がそれぞれ1番目、3番目、5番目の"文字を「閉じる」と仮定します。

二重引用符が何であるかを理解します"${BASH_SOURCE[0]}"。しかし、他の2組の二重引用符の目的は何ですか?

一方、高い投票にもかかわらず、上記のコードが間違っている場合、名目上の意図を達成する正しい方法は何ですか?

(通過名目上の意図pwd私の言葉は、最初の-ingによって返された値をcd返されたディレクトリにdirname "${BASH_SOURCE[0]}"集め、サブシェルで-ingを実行して親シェルが変更されないようにするcdことです。$PWD

答え1

と入力すると、$(...)最初から引用が始まります。

つまり"..."$(...)お互いの中。コマンド置換には$(...)1つ以上を含めることができます。十分二重引用符で囲まれた文字列。さらに、二重引用符で囲まれた文字列には、1つ以上の文字列を含めることができます。十分コマンドの置き換え。 しかし、彼らは互いに絡み合っていません。 したがって、コマンド置換内で始まる二重引用符文字列は、コマンド置換の外部には拡張されず、その逆も同様です。

したがって、次の点を考慮してください。

DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"

中に含まれる内容物は$(...)次のとおりです。

dirname "${BASH_SOURCE[0]}"

上には${BASH_SOURCE[0]}二重引用符があります。外部二重引用符または一重引用符は二重引用符であるかどうか$(...)を判断する際には${BASH_SOURCE[0]}関係ありません。

外層には以下が$(...)含まれます。

cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd

ここでは、式を$( dirname "${BASH_SOURCE[0]}" )二重引用符で囲みます。$(...)外部に引用文があるという事実は、内部の内容を考慮すると関係がありません。内部に引用符があるという事実$(...)も不適切です。

二重引用符が一致する方法は次のとおりです。

ここに画像の説明を入力してください。

答え2

bash入力を解析する方法(および通常はシェル)に関する質問の混乱は正しくありません。存在する:

DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"

まず、bash課題の右側を長い文字列に解析します。$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )二重引用符が内部に表示される可能性があるためです。二重引用符

その後、bashコマンド置換の解析を開始します。開いた角かっこと閉じ括弧の後のすべての文字は、コマンド置換でコマンドを構成するために使用されるため、次のような結果が得られます。

cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd

シェルは引き続き複合コマンドを解析し、2 つの部分に分割します。

  • cd "$( dirname "${BASH_SOURCE[0]}" )"
  • パスワード

その後、同じ解析規則がに適用されますが、cd "$( dirname "${BASH_SOURCE[0]}" )"今回は二重引用符は重複せずに意味があります。これは結果のフィールド分割を防ぎます$( dirname "${BASH_SOURCE[0]}" )${BASH_SOURCE[0]}最も外側の二重引用符とは対照的に)RHSで変数の割り当てを防ぐ必要はありません。split+glob)。


このルールは次に適用されます。すべてのPOSIXシェルのコマンドの置き換え。パズルの詳細を読むことができます。POSIX仕様のトークン認識部分

関連情報