ただ奇妙なシナリオに直面しました。これが機能であるかどうかはわかりません。そうでない場合は、どのようなセキュリティリスクを示しますか? grepは何も得られないかもしれませんが、他のディレクトリクロールユーティリティを使用することはできますか?
再現する方法は次のとおりです。
touch ./-vR
grep hi *
返されない項目はすべてhi
再帰的に返されます。
答え1
getopt
これはGNU(GNUツールのオプション解析)の既知のバグです。
grep hi -vR
hi
-vR
POSIXでは、以前はオプションではなく引数として認識されていなかった多くのオプションをoptionsというファイルで見つける必要があります(hi
以下を参照)。
ほとんどのGNUツール、デフォルトモード、またはGNU APIで使用されるツールは、環境を除いてgetopt
それらを尊重しません。POSIXLY_CORRECT
したがって、以下が必要です。
POSIXLY_CORRECT=1 grep hi *
(grep
POSIX互換方式で強制動作)または
grep -- hi *
(オプションの終わりを明確に表示--
)
grep hi ./*
(すべてのファイル名はで始まる必要があるため、./
そうではありません-
。)
とにかく、次のようにしてください:
grep -e hi -vR
これはオプションではなく引数ではなくオプションの引数であるgrep
ため、GNUと非GNUの問題があるため、次のものが必要です。hi
-e
grep -e hi -- *
または(より良い理由は、名前付きファイルの問題も解決するためです-
):
grep -e hi ./*
(POSIXLY_CORRECTは役に立ちません)。
答え2
grep
これは、GNU(および同じ方法でコマンドライン解析を実行する他のGNUユーティリティ)の「機能」です。 GNUが使用するコマンドライン解析ルーチンを使用すると、フラグを立てることができます。後ろにコマンドラインの最後のオペランドは何ですか?
この問題を解決するには、コマンドラインフラグがなくなったことをユーティリティに明示的に通知します。
$ grep -- hi *
これにより、シェルgrep
拡張ファイル名はオプションではなくファイル名として扱われます。*