バグや機能? Grepはファイルをフラグとして受け入れます。

バグや機能? Grepはファイルをフラグとして受け入れます。

ただ奇妙なシナリオに直面しました。これが機能であるかどうかはわかりません。そうでない場合は、どのようなセキュリティリスクを示しますか? grepは何も得られないかもしれませんが、他のディレクトリクロールユーティリティを使用することはできますか?

再現する方法は次のとおりです。

  • touch ./-vR
  • grep hi *

返されない項目はすべてhi再帰的に返されます。

答え1

getoptこれはGNU(GNUツールのオプション解析)の既知のバグです。

grep hi -vR

hi-vRPOSIXでは、以前はオプションではなく引数として認識されていなかった多くのオプションをoptionsというファイルで見つける必要があります(hi以下を参照)。

ほとんどのGNUツール、デフォルトモード、またはGNU APIで使用されるツールは、環境を除いてgetoptそれらを尊重しません。POSIXLY_CORRECT

したがって、以下が必要です。

POSIXLY_CORRECT=1 grep hi *

grepPOSIX互換方式で強制動作)または

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拡張ファイル名はオプションではなくファイル名として扱われます。*

関連情報