sjsam's helpful answer bietet tragfähige Lösungen, aber es ist wert tiefer Graben:
können in zwei Gruppen unterteilt werden (unter Verwendung von POSIX-Terminologie)
Argumente übergeben zu Unix-Utilities (wie cat
):
Optionen (z. B. -l
; abhängig von der Definition der Option, möglicherweise gefolgt von einem Option-Argument) - schaltet das das grundlegende Verhalten des Dienstprogramms ändern.
Operanden (beispielsweise ein Dateiname) - die Daten, die das Dienstprogramm auf arbeitet.
POSIX requires all options, if any, to come before any operands, aber GNU Dienstprogramme diese Anforderung entspannen für Bequemlichkeit Verwirbelung Optionen und Operanden zu ermöglichen.
Wie auch immer, ein gefolgt von einem Buchstaben oder einer Ziffer impliziert im Allgemeinen eine Option.
wie So Operanden zu ermöglichen vorbei, die mit -
- Start passieren , spezielle Option --
kann jedes Dienstprogramm zu sagen, verwendet werden: behandelt alle nachfolgenden Argumente als Operanden, auch wenn sie aussehen wie Optionen.
Da Operand -q
in diesem Fall sieht wie eine Option, es mit --
vorhergehenden er als Operanden markieren ist ein Muss.
Was, wie Zeichenfolge übergeben -q
selbst als Argument:
-q
enthält keine Schale Metazeichen, so dass die Schale es gibt, wie sie ist zu cat
- keine benötigt zitieren.
Zitiert ('-q'
, "-q"
, $'-q'
, \-q
) tut keinen Schaden in diesem Fall, hat aber absolut keine Wirkung hier, weil die Schale - nachdem alle Erweiterungen angewendet haben - einfach entfernt alle zitieren Zeichen (ein Prozess namens quote removal) vor der Übergabe des Wortes an cat
(wie Charles Duffy Anmerkungen in den Kommentaren zu der Frage).
Die Anführungszeichen werden in jedem Fall durch die Shell entfernt * bevor * die 'cat'-Programmdatei gestartet wird. Daher hat es keine Ahnung, welche Zitate (wenn überhaupt) verwendet wurden. Sie steuern, wie die Shell Inhalte analysiert und wie die Shell einen String in eine Argumentliste aufteilt - aber für jedes einzelne zitierte Formular ist der aufgerufene syscall genau der gleiche: 'execv ("/usr/bin/cat " , {"cat", "-q", NUL}) 'oder ein Äquivalent dazu. –
'cat ./- q', BTW, würde funktionieren. –