Warum gibt der Befehl echo `echo \\\z` \z aus?

Warum gibt der Befehl echo `echo \\\z` \z aus?

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 \xverhält es sich wie folgt 'x'(außer wenn xes sich um das Zeilenumbruchzeichen handelt).

Also:

echo \\\x

ist wie:

echo '\''x'

Oder

echo '\x'

Wird also echomit zwei Argumenten aufgerufen, eines, das echo(seinen Namen) enthält, und eines, das enthält \x.

Pro POSIX, das Verhalten, echowenn einer seiner Operanden (Argumente außer dem Befehlsnamen) einen Backslash enthält oder sein erster Operand -nnicht 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 \zes sich nicht um eine der Standard-Escape-Sequenzen handelt.

Mit einem UNIX-kompatiblen echo, wie dem echointegrierten 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.

zDie Implementierung könnte entweder \zoder no such escape sequence: \zoder ein NUL-Zeichen ausgeben …

In der Praxis ist mir allerdings keine Implementierung bekannt, die \zeine 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, printfstattdessen 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

verwandte Informationen