1

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 ответа2

1

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
0

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

#!/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?

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .