の使用は、、、、およびの非標準(POSIX準拠ではない)機能であるブレース拡張{html,php,htm}
としてのみ機能します。bash
ksh
zsh
ブレース拡張が認識されるためには、コマンドラインで引用符で囲まれていない(aの一部)トークンである必要があります。
ブレース展開は複数の引数に拡張されるため、手元にある場合は、個別に渡した場合と同じように、複数のオプションが表示grep
されます。 --include=...
ブレース拡張の結果は、落とし穴があるグロブ(ファイル名拡張)の対象になります。
結果として得られる各引数は、.などの引用符で囲まれていないグロブメタ文字が含まれている場合は、一致するファイル名にさらに拡張できます*
。
これは、次のようなトークンでは起こりそうにありませんが(たとえば、一致するもののように文字通り名前--include=*.html
が付けられたファイルが必要になる場合)、一般的に覚えておく価値があります。--include=foo.html
nullglob
シェルオプションがたまたまオンになっていて(shopt -s nullglob
)、グロブが何にも一致しない場合、引数は破棄されます。
したがって、完全に堅牢なソリューションの場合は、次を使用します。
grep -R '--include=*.'{html,php,htm} pattern /some/path
'--include=*.'
一重引用符で囲まれているため、リテラルとして扱われます。これにより、グロブ文字としての不注意な解釈を防ぎます。*
{html,php,htm}
、-必要に応じて-引用符で囲まれていない中括弧の展開[1]は、 3つの引数に
展開されます。これは、トークン{...}
の直後にあるため、その'...'
トークンを含みます。
したがって、シェルによる引用符の削除後、次の3つ のリテラル引数が最終的にに渡されgrep
ます。
--include=*.html
--include=*.php
--include=*.htm
[1]より正確には、引用符を外す必要があるのは中括弧拡張の構文関連部分のみです。リスト要素は引き続き個別に引用でき、中括弧拡張後に不要なグロブが発生する可能性のあるグロブメタ文字が含まれている場合は、引用する必要があります。この場合は必要ありませんが、上記は次のように書くことができます。
'--include=*.'{'html','php','htm'}