カラーgrep出力:GREP_OPTIONSではないエイリアスではありません

カラーgrep出力:GREP_OPTIONSではないエイリアスではありません

私が望むカラー出力grep

....しかし

  • 戦略1:GREP_OPTIONS。しかし、これは廃止されました。バラよりhttp://www.gnu.org/software/grep/manual/html_node/Environment-Variables.html
  • 戦略2:一見すると、GREP_COLORSはソリューションのように見えますが、機能は異なります。
  • 戦略3:エイリアス。find ... | xargs grepxargsがエイリアスを評価しないため、機能しません。
  • 戦略4:簡単なラッパースクリプトを作成します。いいえ、私の考えはあまりにも汚れていて、問題を解決するよりも多くの問題を引き起こすようです。
  • 戦略5:ソースコードパッチ
  • 戦略6:grep開発者に連絡してGREP_OPTIONSの変更を依頼してください。
  • NICE-and-EASYポリシー:...このコンテンツがありません。私はまったく手がかりがありません。

この問題をどのように解決しますか?

ベストアンサー1

OPが言及した理由のいくつかは実際には根拠がありません(例えば、シェルスクリプトの仕組みの理解が不足し、単純なラッパースクリプトがパフォーマンスに影響を与えない方法の理解が不足しています)。

この回答は、戦略4が実際にいくつかの理由(実装の容易さ、低いオーバーヘッド、すべてのユースケースに対する柔軟性など)のために良い解決策であることを示しています。

(Typical)または(OpenSUSE、その他)grepにインストールされているほとんどのディストリビューションでは、デフォルトはまたは。/bin/usr/binPATH/usr/local/bin/bin/usr/bin/usr/local/bin/grep

#!/bin/sh
exec /bin/grep --color=auto "$@"

/bin/shディストリビューションが提供するPOSIX互換シェル(通常bashまたはdash)はどこにありますか?grepの場合は、/usr/bin次のように設定します。

#!/bin/sh
exec /usr/bin/grep --color=auto "$@"

ラッパースクリプトにはいくつかのパフォーマンスオーバーヘッドがあります。

スクリプトにはオーバーヘッドはほとんどありません。このexec文が意味するのは、スクリプトインタプリタがバイナリに置き換えられることです。grepこれは、実行中にシェルがgrepメモリに保持されないことを意味します。したがって、唯一のオーバーヘッドは、スクリプトインタプリタをもう一度実行すること、つまりウォールクロック時間が少し遅れることです。遅延時間はほぼ一定であり(ページキャッシュにgrepすでに存在するかどうか、使用可能なI / O帯域幅の量によって異なります)、実行にかかる時間や処理されるデータの量shによって異なります。grep

それでは、遅延時間、つまりラップスクリプトによって追加されたオーバーヘッドはどのくらいですか?

詳しくは、上記のスクリプトを作成して実行してください。

time /bin/grep --version
time /usr/local/bin/grep --version

私のコンピュータでは、前者はリアルタイムで(多くの実行後)0.005秒かかりますが、後者はリアルタイムで0.006秒かかります。したがって、私のコンピュータでラッパーを使用するためのオーバーヘッドは、呼び出しごとに0.001秒(またはそれ以下)です。

これは些細なことです。

多くの一般的なアプリケーションとユーティリティは同じ方法を使用しているため、「汚れた」ものも見られませんでした。/binコンピュータでこれらのクラスのリストを表示するには、次の手順を/usr/bin実行します。

file /bin/* /usr/bin/* | sed -ne 's/:.*shell script.*$//p'

私のコンピュータでは、上記の出力には、私がよく使用する、、、、、、、egrepおよびが含まれます。ラッパースクリプトに依存しているため、ディストリビューション全体が「汚い」と思わない限り、そのようなラッパースクリプトが「汚れている」と考える理由はありません。fgrepzgrepwhich7zchromium-browserlddxfig

PATHにラッパースクリプトを入れるときに発生する可能性のある問題

スクリプトではなく、人間のユーザーだけがデフォルトで色をサポートするgrepバージョンを使用する場合(ターミナルに出力する場合)、ラッパースクリプトの名前を指定するか、colorgrepOPcgrepが適切であると判断する名前を指定できます。

これにより、動作がgrepまったく変わらないため、すべての互換性の問題が回避されます。


ラッパースクリプトを使用してgrepオプションを有効にしますが、新しい問題を回避してください。

GREP_OPTSサポートされていない場合でもGREP_OPTIONS(廃止)、カスタマイズをサポートするためにラッパースクリプトを簡単に書き換えることができます。このようにして、ユーザーはexport "GREP_OPTIONS=--color=auto"自分のプロフィールを追加したり、同様に作成したりできます。/usr/local/bin/grepもしそうなら

#!/bin/sh
exec /bin/grep $GREP_OPTIONS "$@"

$GREP_OPTIONSユーザーが複数のオプションを指定できるように引用符がありません。

私のシステムでは、emptyまたはusingをtime /usr/local/bin/grep --version使用して、実行は以前のバージョンのラッパースクリプトと同じくらい高速です。つまり、通常は通常の実行時間より1ミリ秒長くなります。GREP_OPTIONSGREP_OPTIONS=--color=autogrep

最後のバージョンは私が個人的に推奨するバージョンです。

要約すると、OPの戦略4は次のようになります。

  • 開発者がgrepおすすめ

  • 実装が簡単です(2行)

  • オーバーヘッドはわずかです(各呼び出しごとにこの特定のノートブックの待ち時間が1ミリ秒ずつ追加されます。すべてのシステムで簡単に確認できます)。

  • サポートを追加するラッパースクリプトとして実装可能GREP_OPTS(廃止/サポートされていない代替GREP_OPTIONS

  • スクリプトや既存のユーザーにまったく影響を与えずに(colorgrep/など)実装可能cgrep

すでにLinuxディストリビューションで広く使われている技術なので、「汚い」技術ではなく一般的な技術だ。

別のラッパー(/)で実装すると、動作にまったく影響を与えないため、colorgrep新しい問題は発生しません。サポートを追加するラッパースクリプトとして実装されている場合、これを使用すると、デフォルトのアップストリームを追加するのとまったく同じリスクがあります(既存のスクリプトの問題)。したがって、「解決するよりも多くの問題を生成する」という説明は完全に間違っています。追加の問題は生成されません。cgrepgrepGREP_OPTSGREP_OPTS=--color=auto--color=auto

おすすめ記事