web-dev-qa-db-ja.com

grepをlessにパイプして、grepコマンドをファイル名として表示します

less -Mは、次のようにファイル名をプロンプトとして表示します。

      1 asdf
test.txt lines 1-1/1 (END)

読みやすくするために、grepをlessにパイプするのが好きです。 grepコマンドをプロンプトのファイル名として解釈することを減らすことはできますか?

通常は次のとおりです。

grep asdf test.txt | less

      1 asdf
lines 1-1/1 (END)

私は...したい:

grep asdf test.txt | less

      1 asdf
grep asdf test.txt lines 1-1/1 (END)

私はこれをすべてスクリプトでラップし、$0引数を使用して処理できることを知っていますが、ここで車輪の再発明を試みていません。

これは、いくつかのコマンドライントリックで可能ですか?

1
Mike Dannyboy

lessは、誰かがlessのコードを非常に複雑にして、そのプロセスグループを見つけない限り、標準入力を介してデータをパイプに供給しているパイプの反対側に何があるかについての手がかりを持っていません。 lessは、そのプロセスグループ内のおよび他のプロセスで実行されており、それらすべてがどのように組み合わされているかを誰が知っていますか(シェルはこの情報を知っていますが、利用できない場合があります)。

less(1)を読んでみると、プロンプトをカスタマイズするための-Pオプションが見つかるかもしれません。

$ echo hi | less -P '?f%f:Standard input'
hi
Standard input

したがって、理論的には、Standard inputビットを現在のシェルパイプラインに置き換えることができれば...setが実行されたときにlessが何であるかを見てみましょう...

$ function less { set > whatisset; command less "$@"; }
$ echo foo | less
foo
$ egrep 'echo|foo' whatisset
$ 

したがって、mkshまたはechofooと同等)はシェル環境のどこにも表示されないため、grepに使用するのは明らかではありません( zshそしてああすごいLinuxのbashは設定で環境をスパムしますが、これも同じ話です)。実際、zshを使用すると、preexec関数を使用してコマンドラインを使用できるようにすることができます。

$ zsh
% function preexec { shift; SHORT=$1; }
% function less { set > whatisset; command less "$@"; }
% echo foo | less
foo
% grep SHORT whatisset
SHORT='echo foo | less'
% 

だから人は次のようなことをすることができます

% less() { =less -P '?f%f:'${SHORT%% | less} "$@"; }
% echo hi|less
hi
echo hi
1
thrig