BSD grepを使用すると `--exclude-dir "_book"`は機能しますが、 `--exclude-dir={_book}`が失敗するのはなぜですか?

BSD grepを使用すると `--exclude-dir "_book"`は機能しますが、 `--exclude-dir={_book}`が失敗するのはなぜですか?

私のgrepバージョンは次のgrep (BSD grep) 2.5.1-FreeBSDとおりです。私のオペレーティングシステムは次のとおりです。OSX 10.13.3 (17D47)

gitbookリポジトリがあり、_bookgrepを使用するときに無視したい一時ディレクトリがあります。

私はそれを使用したときにディレクトリgrep -Fnrl mysql ./ --exclude-dir={_book}を除外しませんでした_book。結果は次のとおりです。

...
.//UTILITIES/my_utils/shell_scripts/get_several_days_mysql_data_log.sh
.//_book/search_jieba_index.dat
.//_book/LANGUAGES/awk/awk_magic.html

しかし、このコマンドはgrep -Fnrl mysql ./ --exclude-dir "_book"私が期待した結果を提供します。結果は次のとおりです。

...
.//UTILITIES/my_utils/shell_scripts/get_several_days_mysql_data_log.sh

私はstackoverflowを検索して最初のコマンドスタイルに言及し、3つの賛成票を得た質問を見つけたので、場合によってはうまくいくようです。
質問リンクは次のとおりです。複数のディレクトリを除外するには、--exclude-dirフラグでgrepを使用します。

なぜこれが起こるのですか?
成功を除外するために最初のコマンド方法を使用するにはどうすればよいですか_book

答え1

その記事はbashの利点を活用しています。支柱の拡張:

$ printf "%s\n" --exclude-dir={a,b,c}
--exclude-dir=a
--exclude-dir=b
--exclude-dir=c

ただし、要素が1つしかない場合は、中括弧拡張は適用されず、中括弧はそのまま残ります。

$ printf "%s\n" --exclude-dir={a}
--exclude-dir={a}

中括弧の拡張は、grepではなくbash(および他のいくつかのシェル)の機能なので、grepは名前付きの名前を除外するように指示するようです{_book}

答え2

これは他の「コマンドスタイル」ではありません。彼らは以下を利用しています。強く打つ特徴ではなくgrep特性です。

次のコマンドを実行して読みます。

LESS='+/Brace Expansion' man bash

中かっこ内にカンマ区切りの値がある場合シェルgrep表示する前に複数のパラメータに展開してください。

ディレクトリだけを渡すので、中かっこ拡張は必要ありません。

項目の間に項目が1つしかない括弧を使用する場合(範囲を表すカンマと二重ピリオドなし)、シェルは中括弧を残します。grepリテラル名を渡す必要があります{_book}。これは除外するディレクトリではありません。


二重引用符も必要ないことに言及する価値があります。

grep -Fnrl mysql ./ --exclude-dir _book

...うまくいくでしょう。

二重引用符は害を与えませんが、必須ではありません。あなたはそれらを使用することができますみんなgrepパラメータはシェルが表示される前に引用符が削除されるため、同じ結果が得られます。

grep '-Fnrl' "mysql" './' "--exclude-dir" \_\b\o\o\k

コマンド名自体を引用することもできます'grep'少し別の意味。特にエイリアス照会を抑制します。たとえば、Ubuntuシステムでは、通常、.referencegrepエイリアス(またはその一部)がこのエイリアスをバイパスします。grep --color=auto"grep"

gr\ep -Fnrl mysql ./ --exclude-dir _book

この物語の教訓は、使用する言語の引用規則を知ってください。

あるいは、間違いを「して」混乱した結果を引き起こす可能性があります。

関連情報