POSIX

POSIX

POSIX規格に関する興味深い動画をYouTubeで見ました。

結果をご存知の方いらっしゃるかと聞く講義の一部です。

echo \\\\\\

Bashとsh(POSIX標準?)

sh-3.2$ echo \\\\\\

\\

bash$ echo \\\\\\

\\\

その映像をまた探したかったのに見つけられませんでした。

どのようにこのようなことが起こったのか理解できません。

答え1

少し複雑になります。実際にはありますサムさまざまなシナリオ:2つのPOSIXバリエーションとBashの機能。

まず、シェルはユーザーが作成した内容を処理します。 POSIXシェル言語とBash、バックスラッシュ引用サポート、どちら

後続の文字のリテラル値を保持します。

したがって、指定されたコマンドのパラメータの1つを表します\\\

あなたの例には、echo \\\\\\3対のバックスラッシュが含まれています。シェルはこれらのエスケープを解釈し、3つのバックスラッシュを引数として提供します\\\echoecho '\\\'

すべての場合で、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-defaultPOSIX / XSIの動作が発生します。

GNU coreutilsもecho同じことをします。


これは次のことを意味します。

  1. Bashでは、シェルレベルの解析のみが発生し、3つのバックスラッシュが出力されます。
  2. POSIX/XSI 環境ではバックスラッシュが解釈されます。二重、2つのバックスラッシュが出力されます。
  3. 純粋なPOSIX環境では、実装はこの動作を選択できます。表示される出力バージョンはすべて許可されます。
  4. を使用してエスケープ文字を自動的に解釈するXSI動作を持つようにBashを設定できますが、shopt -s xpg_echo明示的な要求なしでは有効になりません。

関連情報