POSIX規格に関する興味深い動画をYouTubeで見ました。
結果をご存知の方いらっしゃるかと聞く講義の一部です。
echo \\\\\\
Bashとsh(POSIX標準?)
sh-3.2$ echo \\\\\\
\\
bash$ echo \\\\\\
\\\
その映像をまた探したかったのに見つけられませんでした。
どのようにこのようなことが起こったのか理解できません。
答え1
少し複雑になります。実際にはありますサムさまざまなシナリオ:2つのPOSIXバリエーションとBashの機能。
まず、シェルはユーザーが作成した内容を処理します。 POSIXシェル言語とBash、バックスラッシュ引用サポート、どちら
後続の文字のリテラル値を保持します。
したがって、指定されたコマンドのパラメータの1つを表します\\
。\
あなたの例には、echo \\\\\\
3対のバックスラッシュが含まれています。シェルはこれらのエスケープを解釈し、3つのバックスラッシュを引数として提供します\\\
。echo
echo '\\\'
すべての場合で、echo
コマンドは同じ引数を持ちますが、異なる方法で解釈します。
POSIX
オプションのPOSIX拡張(XSIまたはX /オープンシステムインターフェース)は現在、幅広いサポートを受けています。 XSIサポートなしでPOSIXと互換性がありますが、この場合は違いがあります。
XSIで、echo
パラメータ内で解釈するにはバックスラッシュエスケープが必要です。、含む
\\ Write a <backslash> character.
XSIなし、POSIXは代わりに次のように言います。
最初のオペランドが-nの場合、またはオペランドに<backslash>文字が含まれている場合、結果は実装に従って定義されます。
したがって、特定の結果は指定されません(または表示される両方のバージョンが許可されています)。
POSIX / XSIは、echo
最初のバックスラッシュペアをエスケープ自体として解釈して\\
出力を生成します。
吹く
バッシュ内蔵echo
一方、エスケープシーケンスは、-e
明示的に必要なオプションを提供しない限り解釈されません。
存在するBashのPOSIXモード、さまざまな状況でアクティブになりますsh
(まだ同じことをしています。(これは「実装によって定義された」動作が許可されます)。xpg_echo
このオプションを有効にするか、shopt -s xpg_echo
実行bash
可能ファイルが構成オプションでビルドされると、--enable-xpg-echo-default
POSIX / XSIの動作が発生します。
GNU coreutilsもecho
同じことをします。
これは次のことを意味します。
- Bashでは、シェルレベルの解析のみが発生し、3つのバックスラッシュが出力されます。
- POSIX/XSI 環境ではバックスラッシュが解釈されます。二重、2つのバックスラッシュが出力されます。
- 純粋なPOSIX環境では、実装はこの動作を選択できます。表示される出力バージョンはすべて許可されます。
- を使用してエスケープ文字を自動的に解釈するXSI動作を持つようにBashを設定できますが、
shopt -s xpg_echo
明示的な要求なしでは有効になりません。