カラー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

答え2

提供した最初のポリシーに関するドキュメントには、次のものがあります。

代わりにエイリアスまたはスクリプトを使用してください。たとえば、grepが "/usr/bin"ディレクトリにある場合は、$ HOME / binをPATHに追加し、次の内容を含む実行可能なスクリプト$ HOME / bin / grepを生成できます。

#! /bin/sh
export PATH=/usr/bin
exec grep --color=auto --devices=skip "$@"

したがって、エイリアシングが不可能な場合は、ラッパースクリプトが唯一の方法です。

答え3

この変数が使用されなくなった理由は、GREP_OPTIONSスクリプトのどこかで呼び出されたときに問題を引き起こす傾向があり、grepスクリプトが変数の代替オプションを使用できないためです。ラッパースクリプトを作成すると、grep同じ問題が発生します。他の名前を与えない限り

$ cat ~/bin/cgrep
#!/bin/sh
exec grep --color=always "$@"
$ find … -exec cgrep … {} +

または、お気に入りのオプションを変数に保存します。 zsh以外のシェルでは、\[*?オプションにワイルドカード()が含まれていると問題になる可能性がありますが、そうでない場合は引用符なしの変数を使用して引数付きのコマンドを取得できます。

cgrep=(grep --color=always)
find … -exec $cgrep … {} +

GNUとBSD grepはディレクトリツリーを再帰的に処理できるため、findほとんどの場合、組み合わせの必要性が減ります。grep

答え4

最も簡単な方法はエイリアスを使用することです(戦略3)。コマンドに本当に興味がある場合は、xargsbash機能を使用してコマンドをオーバーライドできます。

alias grep='grep --color'
xargs() {
    local args
    for ((i=1; i<=$#; i++))
    do
            if [[ "-E -L -P -I -s -d" == *"${!i}"* ]]; then
                    ((i=i+1))
            elif [[ ${!i:0:1} != "-" ]]; then
                    if [[ ${!i} == "grep" ]]; then
                            args="--color"
                    fi
                    /usr/bin/xargs ${@:1:i} $args ${@:i+1}
                    return;
            fi
    done
}

ただし、これはチームが推奨するソリューションであるように見えるラッパーコマンドを使用するよりも優れていませんgrep

/usr/local/bin/grep:

#!/bin/bash
/bin/grep --color "$@"

私の考えでは、grep開発チームに連絡して、GREP_OPTIONS特定の環境変数に基づいて色をアクティブにするための単純な変数置換を提供するように依頼する必要があります。grep

colorオプションをデフォルトで有効またはGREP_COLORS設定してから有効にするのは非常に簡単です。

関連情報