Was bedeutet folgendes:
basedir=$(dirname "$(echo "$0" | sed -e 's,\\,/,g')")
Ich interessiere mich besonders für diesen Teil:
varible=$(...)
Ich weiß, dass Klammern verwendet werden, um einen Unterprozess auszuführen, aber was ist, wenn sie zusammen mit verwendet werden $
?
man bash
und suchen Sie nachAntworten:
Aus dem Bash-Handbuch (
man bash
):(Dies gilt für alle Bourne-wie Muscheln, dh
sh
,ksh
,zsh
,bash
etc. undzsh
ist zu erfassen Daten mit eingebetteten NUL - Zeichen auf diese Weise auch in der Lage)Der Befehl
weist der Variablen den Namen des Verzeichnisses zu, in dem sich das Skript befindet (und ändert gleichzeitig alle umgekehrten Schrägstriche in Schrägstriche)
basedir
. Alle Fehler, Warnungen oder sonstigen Diagnosemeldungen, die an den Standardfehlerstrom ausgegeben werden, werden weiterhin auf dem Terminal angezeigt ($(...)
erfasst nur die Standardausgabe des Befehls).Die Shell beginnt mit der Ausführung der innersten Befehlssubstitution:
Die Ausgabe davon wird als Zeichenfolge angegeben
dirname
, und die Ausgabe davon wird der Variablen zugewiesenbasedir
.Die doppelten Anführungszeichen dienen dazu, sicherzustellen, dass keine Wortteilung oder Dateinamen-Globbing durchgeführt wird. Andernfalls kann es vorkommen, dass das Skript fehlschlägt oder eine seltsame Ausgabe erzeugt, wenn
$0
(der Name des Skripts einschließlich des Pfads, der zur Ausführung verwendet wird) ein Leerzeichen enthält Zeichen oder ein Dateiname Globbing-Zeichen (wie?
oder*
).Im Allgemeinen ist es eine gute Idee, immer Erweiterungen (variable Erweiterungen, Befehlssubstitutionen und arithmetische Erweiterungen) anzugeben. In dieser Frage und ihren Antworten finden Sie eine hervorragende Erklärung, warum dies eine gute Idee ist.
Wenn das Skript als ausgeführt wurde
dann
basedir
wird der Wert von erhalten/usr/local/bin
.Oder auf Cygwin:
dann
basedir
wird der Wert von erhaltenc:/Users/Me
. Die doppelten Backslashes in der Befehlszeile dienen in diesem Fall nur dazu, die einzelnen Backslashes aus der Shell zu entfernen. Der tatsächliche Wert von$0
istc:\Users\Me\script.sh
.Eine andere Möglichkeit, dasselbe zu tun, ohne es zu verwenden
dirname
,echo
undsed
wärequelle
/bin/sh
von Solaris 10 oder früher) nicht unterstützt wurde$(...)
.Es bedeutet , zu laufen , was innerhalb der ist Klammern in einer Sub - Shell und zurückgeben , dass als Wert , in Ihrem Fall zuweisen , dass zu
varible
.quelle
Die
varible=$(..)
aufgerufene Befehlssubstitution bedeutet nichts weiter, als einen Shell-Befehl auszuführen und seine Ausgabe in einer Variablen zu speichern oder mit dem Befehl echo zurück anzuzeigen. Zeigen Sie beispielsweise Datum und Uhrzeit an:und zum Speichern in einer Variablen:
Für weitere Informationen: https://www.cyberciti.biz/faq/unix-linux-bsd-appleosx-bash-assign-variable-command-output/
quelle