サブシェルで中括弧を含むgrep --includeが失敗するのはなぜですか? [コピー]

サブシェルで中括弧を含むgrep --includeが失敗するのはなぜですか? [コピー]

これはシェルで動作します。

grep -R --exclude-dir=storage --exclude-dir=node-modules --include=*.{scss,css} loader.gif

しかし、これは失敗します。

sh -c "grep -R --exclude-dir=storage --exclude-dir=node-modules --include=*.{scss,css} loader.gif"

メッセージなしで失敗し、何も起こりません。

これは働きます:

sh -c "grep -R --exclude-dir=storage --exclude-dir=node-modules --include=*.scss loader.gif"

中かっこの使用--include=*.{scss,css}が失敗するのはなぜですか?

答え1

これはおそらく、あなたのshPOSIX shが通常のPOSIX sh(または少なくともログインシェルよりも簡単です)であり、中かっこ拡張がサポートされていないためです。 Linux システムでは、少なくとも Debian と Debian がデフォルトです。Ubuntu。 Bashを実行するには実行してくださいbash -c

答え2

「拡張時間」のためです。

コマンドを単純化してみましょう。

$ echo --include=*.{scss,css}
--include=*.scss --include=*.css

ご覧のとおり、中括弧は「現在実行中のシェル」(おそらくbash)によって拡張されます。*(or)で始まり、--include=(or)で終わる名前のファイルが現在のディレクトリにない可能性があるため、拡張されません。.scss.css

しかし、以下では

$ sh -c "echo --include=*.{scss,css}"
--include=*.{scss,css}

2つのことが起こります。

  • 中かっこは引用され、文字通り次のシェルに提供されるため、現在実行中のシェル(PRS)によって拡張されませんsh -c

  • 次のシェルは中括弧拡張をサポートしていないため、そのままにしておきます。 echoを使用して印刷します。

したがって、PRSが中かっこを拡張するようにしてください。

sh -c 'echo "$@"' mysh --include=\*.{scss,css}

これは複雑で推奨される回避策ではありません。または、中かっこをサポートするシェルを使用してください。

bash -c 'echo --include=\*.{scss,css}'

どちらも*拡張を防ぐために参照されます。

関連情報