Ich möchte nur die folgende Codezeile in der Shell verstehen. Es wird verwendet, um das aktuelle Arbeitsverzeichnis abzurufen. Mir ist bekannt, dass $(variable)
name den Wert innerhalb des Variablennamens zurückgibt, aber was $(command)
soll zurückgeben? Gibt es den Wert zurück, nachdem der Befehl ausgeführt wurde? In diesem Fall können wir `
den Befehl ausführen.
CWD="$(cd "$(dirname $0)"; pwd)"
Dieselbe Ausgabe kann aus der folgenden Codezeile auch in verschiedenen Versionen der Shell übernommen werden
DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
Ich kann die Bedeutung von $(cd..
und nicht verstehen $(dirname
.
Könnte mir jemand helfen, herauszufinden, wie dieser Befehl ausgeführt wird?
$()
vs``
.: stackoverflow.com/questions/9449778/…Antworten:
Die Verwendung von
$
Ähnlichem${HOME}
ergibt den Wert von HOME. Die Verwendung der$
gleichen$(echo foo)
Mittel bedeutet, dass alles, was sich in den Klammern befindet, in einer Unterschale ausgeführt und als Wert zurückgegeben wird. In meinem Beispiel würden Sie bekommen,foo
daecho
wirdfoo
nach Standard ausschreibenquelle
$(...)
ist eine bessere Möglichkeit, einen Befehl zu schreiben, als zu versuchen, Anführungszeichen zu verwenden. Denken Sie darüber nach, zu schreiben:gcclib=$(dirname $(dirname $(which gcc)))/lib
Verwenden Sie Anführungszeichen. Noch bevor Sie in Markdown in die Schwierigkeiten geraten, ist es schwieriger, sich den Anführungszeichen der verschachtelten Befehle zu entziehen, während Sie dies nicht mit der$(...)
Notation tun .$(echo foo)
wird eine Befehlsersetzung erstellt, keine Unterschale. Die andere aktuelle Antwort macht das richtig. Ich denke, die Befehlssubstitution wird in einer Art Subshell ausgeführt, aber es handelt sich immer noch um unterschiedliche Konzepte.$(echo foo)
versucht, das auszuführen, was aus den Klammern zurückgegeben wird. Er wird zuerst ausgeführt undecho foo
dann ausgeführtfoo
, was einen Fehler darstelltSchauen wir uns verschiedene Teile des Befehls an.
BASH_SOURCE
ist eine Bash-Array-Variable, die Quelldateinamen enthält. Also"${BASH_SOURCE[0]}"
würden Sie den Namen der Skriptdatei zurückgeben.dirname
ist ein Dienstprogramm von GNU coreutils, das die letzte Komponente aus dem Dateinamen entfernt. Wenn Sie also Ihr Skript ausführen, indem Sie sagenbash foo
,"$( dirname "${BASH_SOURCE[0]}" )"
würde zurückkehren.
. Wenn Sie sagtenbash ../foo
, würde es zurückkehren..
; dennbash /some/path/foo
es würde zurückkehren/some/path
.Schließlich
"$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
erhält der gesamte Befehl das absolute Verzeichnis, das das aufgerufene Skript enthält.$(...)
Ermöglicht die Ersetzung von Befehlen, dh die Ausgabe eines Befehls ersetzt den Befehl selbst und kann verschachtelt werden.quelle
dirname
gibt den Pfad der ausgeführten Datei zurück (relativ oder absolut zum aktuellen Arbeitsverzeichnis),cd
ändert das pwd in dieses Verzeichnis undpwd
druckt den absoluten Pfad des aktuellen Arbeitsverzeichnisses aus. Aber warum kommen sie dazu&&
? Und wasDIR
hält, wenn dascd
fehlschlägt?&&
verhindert , dass daspwd
ausgeführt wird, wenn dascd
fehlschlägt, sodassDIR
es leer ist und kein falsches Verzeichnis hat.