コマンド echo `echo \\\z` が \z を出力するのはなぜですか?

コマンド echo `echo \\\z` が \z を出力するのはなぜですか?

コマンドecho $(echo \\\z) 、なぜ出力されるのか分かりません

\z

出力すべきだと思う

答え1

\はシェルの引用演算子です。他の種類の引用符の外側では、\xと同様になります'x'(ただし、xが改行文字の場合は除きます)。

それで:

echo \\\x

のようなものです:

echo '\''x'

または

echo '\x'

は、 (その名前)echoを含む引数と を含む引数の 2 つで呼び出されます。echo\x

POSIXに従ってecho、オペランド (コマンド名以外の引数) のいずれかにバックスラッシュが含まれている場合、または最初のオペランドが である場合の動作は-n指定されていません。それ以外の場合でも動作は異なることがわかります。

UNIX 仕様 (上記リンクで XSI を適用) によれば、 は標準エスケープ シーケンスの 1 つではないecho '\z'ため、 の動作も未指定です。\z

ただし、の組み込みのechoようなUNIX 準拠の を使用すると、次のことが保証されます。echobash -o posix -O xpg_echo

echo '\\z'

と同じ:

echo \\\\z

または:

echo \\\\\z

を出力します\z<newline>

それ以外では、POSIX による保証は得られません。

実装では、zまたは\zまたはno such escape sequence: \zまたは NUL 文字が出力される可能性があります...

しかし、実際には、エスケープ シーケンスとして理解する実装は知らないので\z、試したものはすべて\z<newline>そこに出力されることがわかりました。

ポータブルで信頼性の高いテキスト出力方法が必要な場合は、使用しないでくださいechoprintf代わりに使用してください

答え2

ステートメントエコーをセクションに分割する

\はbashがエスケープとして認識する変数です

したがって、\は文字「\」をエスケープし、\を印刷します。

\zは文字「z」をエスケープしているので、zを印刷します。

これらを合わせると、\z

関連情報