スタックオーバーフロー回答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仕様のトークン認識部分。