私が望むカラー出力grep
。
....しかし
- 戦略1:GREP_OPTIONS。しかし、これは廃止されました。バラよりhttp://www.gnu.org/software/grep/manual/html_node/Environment-Variables.html
- 戦略2:一見すると、GREP_COLORSはソリューションのように見えますが、機能は異なります。
- 戦略3:エイリアス。
find ... | xargs grep
xargsがエイリアスを評価しないため、機能しません。 - 戦略4:簡単なラッパースクリプトを作成します。いいえ、私の考えはあまりにも汚れていて、問題を解決するよりも多くの問題を引き起こすようです。
- 戦略5:ソースコードパッチ
- 戦略6:grep開発者に連絡してGREP_OPTIONSの変更を依頼してください。
- NICE-and-EASYポリシー:...このコンテンツがありません。私はまったく手がかりがありません。
この問題をどのように解決しますか?
答え1
OPが言及した理由のいくつかは実際には根拠がありません(例えば、シェルスクリプトの仕組みの理解が不足し、単純なラッパースクリプトがパフォーマンスに影響を与えない方法の理解が不足しています)。
この回答は、戦略4が実際にいくつかの理由(実装の容易さ、低いオーバーヘッド、すべてのユースケースに対する柔軟性など)のために良い解決策であることを示しています。
(Typical)または(OpenSUSE、その他)grep
にインストールされているほとんどのディストリビューションでは、デフォルトはまたは。/bin
/usr/bin
PATH
/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
およびが含まれます。ラッパースクリプトに依存しているため、ディストリビューション全体が「汚い」と思わない限り、そのようなラッパースクリプトが「汚れている」と考える理由はありません。fgrep
zgrep
which
7z
chromium-browser
ldd
xfig
PATHにラッパースクリプトを入れるときに発生する可能性のある問題
スクリプトではなく、人間のユーザーだけがデフォルトで色をサポートするgrepバージョンを使用する場合(ターミナルに出力する場合)、ラッパースクリプトの名前を指定するか、colorgrep
OPcgrep
が適切であると判断する名前を指定できます。
これにより、動作が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_OPTIONS
GREP_OPTIONS=--color=auto
grep
最後のバージョンは私が個人的に推奨するバージョンです。
要約すると、OPの戦略4は次のようになります。
開発者が
grep
おすすめ実装が簡単です(2行)
オーバーヘッドはわずかです(各呼び出しごとにこの特定のノートブックの待ち時間が1ミリ秒ずつ追加されます。すべてのシステムで簡単に確認できます)。
サポートを追加するラッパースクリプトとして実装可能
GREP_OPTS
(廃止/サポートされていない代替GREP_OPTIONS
)スクリプトや既存のユーザーにまったく影響を与えずに(
colorgrep
/など)実装可能cgrep
すでにLinuxディストリビューションで広く使われている技術なので、「汚い」技術ではなく一般的な技術だ。
別のラッパー(/)で実装すると、動作にまったく影響を与えないため、colorgrep
新しい問題は発生しません。サポートを追加するラッパースクリプトとして実装されている場合、これを使用すると、デフォルトのアップストリームを追加するのとまったく同じリスクがあります(既存のスクリプトの問題)。したがって、「解決するよりも多くの問題を生成する」という説明は完全に間違っています。追加の問題は生成されません。cgrep
grep
GREP_OPTS
GREP_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)。コマンドに本当に興味がある場合は、xargs
bash機能を使用してコマンドをオーバーライドできます。
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
設定してから有効にするのは非常に簡単です。