Ergänzung der bestehenden, hilfreichen Antworten; Tipp an den QZ-Support für die Ermutigung, eine separate Antwort zu veröffentlichen:
Hier kommen zwei unterschiedliche Mechanismen ins Spiel:
(a) ob cut
selbst das an die -d
Option übergebene Trennzeichen (in diesem Fall Leerzeichen) ein separates Argument sein muss oder ob es akzeptabel ist, es direkt an dieses anzuhängen-d
.
(b) wie die Shell im Allgemeinen Argumente analysiert, bevor sie an den aufgerufenen Befehl übergeben werden.
(a) wird durch ein Zitat aus den POSIX-Richtlinien für Versorgungsunternehmen beantwortet (Schwerpunkt Mine)
Wenn die Zusammenfassung eines Standard - Dienstprogramm zeigt eine Option mit einem obligatorischen Option-Argumente [...] eine konforme Anwendung verwenden soll getrennte Argumente für diese Option und das Option-Argument . Eine konforme Implementierung muss es Anwendungen jedoch auch ermöglichen, die Option und das Optionsargument in derselben Argumentzeichenfolge ohne dazwischenliegende Zeichen anzugeben .
Mit anderen Worten: In diesem Fall , weil -d
‚s - Option-Argument ist zwingend erforderlich , können Sie wählen , ob das Trennzeichen festlegen , wie :
- (s) Entweder: ein separates Argument
- (d) OR: als Wert direkt befestigt an
-d
.
Sobald Sie (s) oder (d) ausgewählt haben, ist es das String-Literal-Parsing der Shell - (b) -, das zählt:
Die Äquivalenz wird durch die Schale erklärt String-Literal-Verarbeitung :
Alle oben genannten Lösungen führen zu genau der gleichen Zeichenfolge (in jeder Gruppe), wenn cut
sie angezeigt werden :
(s) : cut
sieht -d
als eigenes Argument ein separates Argument, das ein Leerzeichen enthält - ohne Anführungszeichen oder \
Präfix!.
(d) : cut
sieht -d
plus ein Leerzeichen - ohne Anführungszeichen oder \
Präfix! - als Teil des gleichen Arguments.
Der Grund, warum die Formen in den jeweiligen Gruppen letztendlich identisch sind, ist zweifach, basierend darauf, wie die Shell String-Literale analysiert :
- Die Schale ermöglicht Literal spezifiziert werden wie durch einen Mechanismus genannt zitieren , die annehmen kann mehrere Formen :
- Zeichenfolgen in einfachen Anführungszeichen : Der Inhalt
'...'
wird wörtlich genommen und bildet ein einzelnes Argument
- Zeichenfolgen in doppelten Anführungszeichen : Der Inhalt im Inneren
"..."
bildet ebenfalls ein einzelnes Argument, unterliegt jedoch der Interpolation (erweitert Variablenreferenzen wie $var
Befehlssubstitutionen ( $(...)
oder `...`
) oder arithmetische Erweiterungen ( $(( ... ))
).
\
-Zitieren einzelner Zeichen : Ein \
vorangestelltes einzelnes Zeichen bewirkt, dass dieses Zeichen als Literal interpretiert wird.
- Zitiert durch ergänzt Zitat Entfernung , was bedeutet , dass , sobald die Schale eine Befehlszeile analysiert hat, es entfernt die Anführungszeichen aus den Argumenten (umschließenden
'...'
oder "..."
oder \
Instanzen) - also der Befehl Wesen aufgerufen nie die Anführungszeichen sieht .