Передайте grep в less, показывая команду grep в качестве имени файла

less -M покажет имя файла в виде приглашения, как в:

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

Мне нравится использовать grep для упрощения чтения. Могу ли я получить меньше, чтобы интерпретировать команду 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 аргументы, но не пытаясь изобретать колесо здесь.

Это возможно только с помощью нескольких трюков командной строки?

2 ответа

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 и вау bash в Linux когда-либо спамит среда с настройками, но опять та же история). На самом деле, с 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

Я пошел против себя и написал небольшой сценарий, который выполняет это. Это не красиво, но работает и неплохо, так как всего несколько строк. Всегда готов к улучшениям.

#!/bin/bash

# store all args as string
allargs="$*"

# create temp file named as grep command
TMPFILE=$(mktemp -q "$allargs")

# run grep command
$* --color=always > "$TMPFILE" # --color=always with less -r will highlight results in less

# show results file in less
less -Mr "$TMPFILE"

# delete the temp file
rm -f -- "$TMPFILE"

Беги как ./scriptname grep <opts> <regex> <file(s)>,

Недостаток: если file является * (ищите все в текущем каталоге), затем они раскрываются и делаются как часть имени файла, которое побеждает цель, так как выталкивает команду с экрана (очень длинное имя файла). Если нет способа прокрутить имя файла по горизонтали в less?

Другие вопросы по тегам