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
引数を使用して処理できることを知っていますが、ここで車輪の再発明を試みていません。
これは、いくつかのコマンドライントリックで可能ですか?
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
またはecho
(foo
と同等)はシェル環境のどこにも表示されないため、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