echo \\* - bash バックスラッシュエスケープ動作、逆に評価されますか?

echo \\* - bash バックスラッシュエスケープ動作、逆に評価されますか?

だから私がするときbashで

echo \*
*

*がエスケープされ、文字通り使用されるので、これは正しいようです。

でもそうすれば理解できません。

echo \\*
\*

最初のバックスラッシュが2番目のバックスラッシュをエスケープすると思うので、2つのバックスラッシュ「\\」は文字通り「\」を提供します。次の*には特別な意味があります。私はそれを楽しみにしています:

echo \\*
\file1 file2 file3

回答の概要:\は文字通り使用されるため、文字「a」で始まるファイルを見つけたecho \*かのように動作します。echo a*

後続の質問、まったく同じように印刷するには

\file1 file2 file3

どのコマンドを使用する必要がありますか?たとえば、以下のようにするのにスペースは必要ありません。

echo \\ * 
\ file1 file2 file3

ベストアンサー1

これは、現在のディレクトリにバックスラッシュで始まる名前のファイルがない場合に予想される動作です。吹く*既存のファイル名と一致するように拡張されますが、:

パターンが既存のファイル名またはパス名と一致しない場合は、パターン文字列を変更しないでください。

で始まるファイル名がないため、\パターンはそのままにしてechoパラメータを指定します\*。この動作はしばしば混乱し、他のいくつかのシェル(例zshこれは、Bash で次のコマンドを使用して変更できます。shopt -o failglobすると、エラーが発生しzsh、故障ではなく問題を診断するのに役立ちます。

*パターン文字は?単語のどこにでも表示でき、前後の文字は文字通り一致します。したがって、異なる出力をecho \\*提供しecho \\ *ます。 1つ目は次のすべてのエントリと一致し\(失敗)、2つ目はaを出力してからすべての\ファイル名を出力します。


おそらく、目的の出力を安全に取得する最も簡単な方法は、次を使用することです。印刷機能:

printf '\\'; printf "%s " *

echo *-とにかく、珍しいファイル名が含まれていても安全ではありません\

おすすめ記事