echo "\*"がecho "\\*"と同じ理由

echo "\*"がecho "\\*"と同じ理由

タイトル。 、とecho "\*"まったく同じ出力を持ちますecho "\\*"\*私はGNU bash 5.2.15を使用しています。

echo "\\*"出力を期待していますが、なぜ出力も出るのか\*わかりません。echo "\*"私が知っている限り、状況は次のようになります。

  1. バッシュは以下を見た:$echo "\*"
  2. Bashはバックスラッシュをエスケープせずに二重引用符を処理します。$echo \*
  3. Bashは*バックスラッシュエスケープを使用します。$echo *
  4. 印刷を押します*

私の疑いは3にあります。バックスラッシュ*は2ですでにエスケープされているため、エスケープされていないと思います。これは正しいですか?

答え1

\\脱出口がないようです。

~からBash マニュアルの二重引用符セクション:

特別な意味を持たない先行バックスラッシュ文字は変更されません。

したがって、変換されていない場所はエスケープされていない場所"\*"と同じです。このコマンドはと同じ結果を生成するため、何も変換しません。"\\*"\\\echoprintf %s

答え2

はい、実際に二重引用符はワイルドカードをエスケープします*

二重引用符内の内容は何も意味がないため、*バックスラッシュでエスケープできません。

バックスラッシュを処理するとき、bashは次の文字が現在の状態で特別な意味を持つことを確認します。その場合、バックスラッシュは印刷されず、次の文字はエスケープされます。それ以外の場合は、バックスラッシュのみが印刷されます。

"\*"したがって、最初のバックスラッシュがaを保護する場合は、二重引用符の*コンテキストでエスケープする必要はないので、単に印刷します。

しかし、"\\*"最初のバックスラッシュはバックスラッシュを保護します。できる二重引用符の文脈では特別な意味を持つため、最初のバックスラッシュにエスケープされます。これは、2番目のバックスラッシュが印刷されることを意味します。

関連情報