Bash拡張子が「-」で始まるファイルを引数として渡すのを防ぐ方法は?

Bash拡張子が「-」で始まるファイルを引数として渡すのを防ぐ方法は?

文字列を再帰的に検索しようとしていますが、次grepの結果が表示されます。

$ grep -r "stuff" *
grep: unrecognized option '---corporate-discount.csv'
Usage: grep [OPTION]... PATTERN [FILE]...
Try 'grep --help' for more information.

-Bashがパラメータで始まるファイルを渡すのを防ぐ方法は何ですか?

答え1

まず、ダッシュで始まるパラメータの解釈は、実行中のプログラムgrepや他のプログラムによって異なります。シェルにはこれを制御する直接的な方法はありません。

ほとんどのプログラムと同様に、これらのファイルを(完全に無視せずに)処理しようとしていると仮定すると、これはオプションの終わりを示すとgrep認識されます。--

grep -r -e "stuff" -- *

やりたいことをします。そこの場合も-eastuffで始まります。-

または、次のものを使用できます。

grep -r -e "stuff"  ./*

-後者は、呼び出される現在のディレクトリにファイルがある場合にも問題を回避します。--区切り文字の後にもstdinとgrep解釈されますが、-現在のディレクトリから./-呼び出されるファイルです。-

答え2

到着Bash拡張が「-」で始まるファイルを渡すのを防ぐあなたはそれを使用することができます:

echo [!-]*

ほとんどのシェルで移植可能であるか、ksh、bash、zshにのみ適用されます。

echo !(-*)

例: このファイルを含むディレクトリ

$ echo *
a b c ---corporate-discount.csv d -e --option.txt

リストのみ(extglobアクティブな場合):

$ shopt -s extglob
$ echo !(-*)
a b c d

$ echo [!-]*
a b c d

-ただし、オプションとしてaと宣言されたファイルを解釈しないようにgrepに指示しながら、すべてのファイルを処理するには、次のように追加します./

grep -r "stuff" ./*

または、-リストされたファイルの中に保証された呼び出されたファイルがない場合(grepは、独自のファイルを次の-ように解釈します。標準入力から読む) 次のように使用できます。

grep -r -- "stuff" *

関連情報