Eine StackOverflow- Antwort mit> 3.5K Stimmen enthält diesen Einzeiler für die Zuordnung zum DIR
Verzeichnis des aktuellen Bash-Skripts:
DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
Ich bin verwirrt über die geschachtelten Anführungszeichen. Soweit ich das beurteilen kann, werden folgende Fragmente in doppelte Anführungszeichen gesetzt:
"$( cd "
"${BASH_SOURCE[0]}"
" && pwd )"
... und alles andere rechts vom =
(dh $( dirname
und )
) ist nicht zitiert. Mit anderen Worten, ich gehe davon aus, dass das 2., 4. und 6. "
Zeichen das 1., 3. bzw. 5. "
Zeichen "schließt" .
Ich verstehe, was die doppelten Anführungszeichen "${BASH_SOURCE[0]}"
bewirken, aber wozu dienen die beiden anderen doppelten Anführungszeichen?
Wenn andererseits (und trotz der hohen Stimmenzahl) das obige Snippet falsch ist, wie kann man dann seine nominelle Absicht erreichen?
(Mit nominaler Absicht meine ich: sammeln Sie den Wert, der von zurückgegeben wurde, pwd
nachdem Sie zuerst cd
in das Verzeichnis von zurückgegeben haben dirname "${BASH_SOURCE[0]}"
, und führen Sie das cd
-ing in einer Sub-Shell aus, so dass der Wert $PWD
der übergeordneten Shell unverändert bleibt.)
$( here, it's a subshell, but you are writing code as if you were writing it on the "first level" of the shell .... )
.lsb_dist="$(. /etc/os-release && echo "$ID")"; echo "$lsb_dist"
DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
funktioniert auch.Antworten:
Ihr Rätsel ist nicht richtig, wie
bash
(und die Shell im Allgemeinen) die Eingabe analysiert hat. Im:Zuerst
bash
analysiert , um die rechte Seite Zuordnung zu einer langen Reihe ,$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )
weil doppelte Anführungszeichen innerhalb erscheinen doppelte Anführungszeichen .bash
Beginnen Sie danach mit dem Parsen der Befehlsersetzung. Da alle Zeichen, die offenen Klammern bis hin zu eingeschlossenen Klammern folgen, zum Erstellen des Befehls innerhalb der Befehlsersetzung verwendet werden, erhalten Sie:Die Shell analysiert diesen zusammengesetzten Befehl weiter und teilt ihn in zwei Teile:
cd "$( dirname "${BASH_SOURCE[0]}" )"
Wenden Sie dann dieselbe Parsing-Regel für an
cd "$( dirname "${BASH_SOURCE[0]}" )"
, aber dieses Mal sind doppelte Anführungszeichen nicht redundant, aber sinnvoll. Sie verhindern eine Feldaufteilung auf Ergebnis$( dirname "${BASH_SOURCE[0]}" )
und auch die Erweiterung von${BASH_SOURCE[0]}
(im Gegensatz zu den äußersten doppelten Anführungszeichen ist es in RHS nicht erforderlich, eine variable Zuordnung zu verhindernsplit+glob
).Diese Regel gilt für die Befehlsersetzung in allen POSIX-Shell . Ein detaillierteres Puzzle können Sie im Abschnitt "Token Recognition" der POSIX-Spezifikation lesen .
quelle
Sobald man drinnen ist
$(...)
, fängt das Zitieren von vorne an.Mit anderen Worten,
"..."
und$(...)
können ineinander verschachteln . Die Prozessersetzung$(...)
kann eine oder mehrere vollständige Zeichenfolgen in doppelten Anführungszeichen enthalten. Doppelte Anführungszeichenfolgen können auch eine oder mehrere vollständige Prozessersetzungen enthalten. Sie greifen jedoch nicht ineinander. Eine Zeichenfolge in doppelten Anführungszeichen, die innerhalb einer Prozessersetzung beginnt, wird sich daher niemals außerhalb der Zeichenfolge erstrecken oder umgekehrt.Also, bedenken Sie:
Im Inneren
$(...)
ist:Oben
${BASH_SOURCE[0]}
steht doppelt in Anführungszeichen. Alle doppelten oder einfachen Anführungszeichen außerhalb von$(...)
sind irrelevant, wenn festgestellt wird, dass${BASH_SOURCE[0]}
doppelte Anführungszeichen verwendet werden.Das Äußere
$(...)
enthält:Hier wird der Ausdruck
$( dirname "${BASH_SOURCE[0]}" )
in doppelte Anführungszeichen gesetzt. Die Tatsache, dass es Anführungszeichen außerhalb des Äußeren gibt,$(...)
ist irrelevant, wenn man bedenkt, was darin enthalten ist. Die Tatsache, dass es im Inneren Anführungszeichen$(...)
gibt, spielt ebenfalls keine Rolle.So stimmen die doppelten Anführungszeichen überein:
quelle
irrelevant
? Mit Ausnahme der äußersten Klammern haben alle anderen eine eigene Bedeutung.$(...)
bindet enger als"..."
" ergibt keinen Sinn. Sie sind keine Infix-Operatoren und es gibt keine Hierarchie zwischen ihnen (wenn dies der Fall wäre, würde dies bedeuten, dass entweder Anführungszeichen nicht in Klammern oder Klammern nicht in Anführungszeichen stehen können, aber das ist nicht der Fall). Der Fachbegriff ist das$(…)
und"…"
Nest.