
Der Befehl echo $(echo \\\z)
ist vondas Buch
, ich verstehe nicht, warum es ausgibt
\z
Ich denke, es sollte ausgeben
z
Antwort1
\
ist ein Anführungszeichenoperator für die Shell. Außerhalb anderer Anführungszeichen \x
verhält es sich wie folgt 'x'
(außer wenn x
es sich um das Zeilenumbruchzeichen handelt).
Also:
echo \\\x
ist wie:
echo '\''x'
Oder
echo '\x'
Wird also echo
mit zwei Argumenten aufgerufen, eines, das echo
(seinen Namen) enthält, und eines, das enthält \x
.
Pro POSIX, das Verhalten, echo
wenn einer seiner Operanden (Argumente außer dem Befehlsnamen) einen Backslash enthält oder sein erster Operand -n
nicht angegeben ist. Sie werden feststellen, dass das Verhalten auch außerhalb davon variiert.
Gemäß der UNIX-Spezifikation (unter dem obigen Link gilt XSI) echo '\z'
ist das Verhalten ebenfalls nicht angegeben, da \z
es sich nicht um eine der Standard-Escape-Sequenzen handelt.
Mit einem UNIX-kompatiblen echo
, wie dem echo
integrierten von bash -o posix -O xpg_echo
, können Sie jedoch sicher sein, dass:
echo '\\z'
gleich wie:
echo \\\\z
oder:
echo \\\\\z
wird ausgegeben \z<newline>
.
Darüber hinaus erhalten Sie von POSIX keinerlei Garantie.
z
Die Implementierung könnte entweder \z
oder no such escape sequence: \z
oder ein NUL-Zeichen ausgeben …
In der Praxis ist mir allerdings keine Implementierung bekannt, die \z
eine Escape-Sequenz versteht, daher stelle ich fest, dass alle von mir ausprobierten Implementierungen die \z<newline>
entsprechende Ausgabe haben.
Wenn Sie eine portable und zuverlässige Möglichkeit zur Textausgabe suchen,nicht verwenden echo
, printf
stattdessen verwenden.
Antwort2
Teilen Sie das Anweisungsecho in Abschnitte auf
\ ist die Variable, die Bash als Escape erkennt
Daher wird \ dem Zeichen "\" entzogen und daher \ gedruckt.
\z maskiert das Zeichen "z" und gibt daher z aus
Zusammengefasst haben wir \z