`date` wird nur auf die Ausgabe des date
Befehls erweitert. Es werden jedoch zusätzliche Leerzeichen an Stellen entfernt, an denen die Ausgabe mehr als ein aufeinanderfolgendes Leerzeichen enthält. (Dies liegt daran, dass die Befehlsersetzung einer Wortteilung unterliegt und der echo
Befehl mehrere Argumente verarbeitet.)
In "` date` " sind die doppelten Anführungszeichen schwache Anführungszeichen, sodass sie Variablen erweitern (versuchen Sie" $ PWD ") und eine Befehlssubstitution durchführen. Das Ergebnis der Erweiterung wird als einzelnes Argument an den echo
Befehl übergeben, wobei alle aufeinander folgenden Leerzeichen enthalten sind. Das heißt, die Wortteilung wird nicht durchgeführt.
In "Datum" sind die einfachen Anführungszeichen stärkere Anführungszeichen, sodass sie keine Erweiterung der Variablen oder keine Befehlsersetzung in ihnen ermöglichen.
Weitere Erklärungen finden Sie unter diesem Link .
Bearbeitet den ersten Punkt, wie von Michael Suelmann im Kommentar unten richtig gezeigt .
Chirag Bhatia - chirag64
quelle
date
Befehl.Beide
und
zeigt das Datum an. Die Ausgabe von letzterem sieht aus wie die Ausgabe
date
von sich selbst ausgeführt.Es gibt jedoch einen Unterschied: Der in
"
Anführungszeichen eingeschlossene"
wirdecho
als einzelnes Argument an gesendet . Die Anführungszeichen kapseln die Ausgabe des gesamten Befehls als ein Argument. Daecho
nur die Argumente der Reihe nach mit Leerzeichen dazwischen ausgedruckt werden, sieht es im Grunde gleich aus.Hier ist ein Beispiel für den subtilen Unterschied:
produziert:
aber:
produziert:
Beachten Sie, dass die beiden nachfolgenden Leerzeichen
Nov
ohne Anführungszeichen auf eins reduziert wurden. Dies liegt daran, dass die Shell jedes durch Leerzeichen getrennte Element analysiert und das Ergebnis als 6 Argumente an echo sendet. Wenn Sie es zitieren, erhält echo ein einziges Argument und die Anführungszeichen behalten den Raum bei.Dies wird bei Befehlen, die kein Echo sind, viel wichtiger. Stellen Sie sich zum Beispiel einen Befehl vor
foo
, der zwei Argumente benötigt: ein Datum und eine E-Mail-Adresse.Dies funktioniert in diesem Szenario:
Dies wird das Skript jedoch verwirren, indem 7 Argumente gesendet werden:
quelle
In POSIX-Shells
`date`
ist dies die alte Form der Befehlsersetzung. Die moderne Syntax ist$(date)
.In beiden Fällen werden sie auf die Ausgabe von erweitert,
date
wobei die nachfolgenden Zeilenumbrüche entfernt werden (vorausgesetzt, die Ausgabe enthält keine NUL-Zeichen).Wenn sich
echo
diese Erweiterung jedoch nicht in doppelten Anführungszeichen und in Listenkontexten befindet (z. B. in Argumenten für einfache Befehle wie in Ihrem Fall), unterliegt sie den folgenden Bedingungen:Wort Splitting : dass das ist „Ausgabe des
date
mit dem hinteren Zeilenenden gestrippt“ wird aufgeteilt entsprechend den aktuellen Wert der$IFS
Variablen (standardmäßig enthaltenden Raum, Tab und Neue - Zeile (und NUL mitzsh
)) in mehrere Worte .Zum Beispiel, wenn
date
AusgängeFri 1 Nov 14:11:15 GMT 2013\n
(wie es oft in einem englischen Gebietsschema und in einem Festland britische Zeitzone), und$IFS
enthalten derzeit:
, das werden aufgeteilt in 3 seine Worte :Fri 1 Nov 14
,11
und15 GMT 2013
.zsh
): Das heißt, jedes Wort aus der Aufspaltung oben ergibt , wird für Wildcard - Zeichen sieht (*
,?
,[...]
obwohl einige Granaten mehr haben), und in der Liste der Dateinamen erweitert , dass diese Muster entsprechen. Zum Beispiel, wenn der Ausgangdate
ist?%? 33 */*/* UVC 3432
(wie es oft in Venusian Gegenden und UVC Zeitzone), und$IFS
ist der Standardwert), dann ist das sich ausdehnt , um alle nicht verborgen 3 Zeichen Dateinamen im aktuellen Verzeichnis , dessen mittlere Charakter ist%
,33
, alle alle nicht versteckten Dateien in den nicht versteckt Verzeichnisse aller nicht verborgenen Verzeichnisse des aktuellen Verzeichnisses,UVC
und3432
.Deswegen:
$IFS
die Zeichen auswählen, die Sie teilen möchten.set +f
, um sie zu deaktivieren.Die einzelnen Anführungszeichen geben alles an, sodass die Backtick-Zeichen wörtlich genommen werden.
Beispiel (mit
-x
wird es einfacher zu sehen, was los ist):Wenn die Ausgabe NUL-Zeichen enthält, ist das Verhalten von Shell zu Shell unterschiedlich: Einige entfernen sie, andere kürzen die Ausgabe beim ersten NUL-Zeichen,
zsh
behalten sie bei, beachten Sie jedoch, dass externe Befehle keine Argumente akzeptieren können, die NULs enthaltenquelle
Mit `date` erhalten Sie die Ausgabe des Datums in mehrere Wörter aufgeteilt, da die Wortteilung nach der Befehlsersetzung erfolgt.
Mit "` date` "erhalten Sie die Ausgabe des Datums als ein Wort / Parameter, da zwischen doppelten Anführungszeichen eine Befehlsersetzung erfolgt, die Ausgabe jedoch nicht weiter analysiert wird. Dasselbe gilt für Variablenerweiterungen wie "$ i" in meinem Beispiel unten.
Mit "Datum" erhalten Sie ein buchstäbliches "Datum", da keine Befehlsersetzung zwischen einfachen Anführungszeichen erfolgt.
Vielleicht werden die Unterschiede der 3 Formen auf diese Weise deutlicher:
quelle