Как автоматически передать меньше, если результат больше, чем страница в моей оболочке? - PullRequest
28 голосов
/ 13 ноября 2010

В основном я не буду использовать | less для каждой команды из оболочки.

Pipe to less используется только тогда, когда я действительно запускаю команду без is и обнаруживаю, что она не помещается на странице. Это стоило мне двух запусков одной и той же команды оболочки.

Есть ли способ, чтобы каждый раз, когда результат команды был больше, чем отображаемая страница, он автоматически передавался в меньшую сторону?

Ответы [ 5 ]

17 голосов
/ 13 ноября 2010

Передайте его на less -F aka --quit-if-one-screen:

Вызывает автоматический выход при меньшем, если весь файл может отображаться на первом экране.

13 голосов
/ 14 ноября 2010

Самая значительная проблема при попытке сделать это состоит в том, чтобы отключить его при запуске программ, которым нужен tty.

Что я бы порекомендовал, так это для программ и утилит, которые вы часто используете, создаватьфункции оболочки, которые обертывают их и передают less -F.В некоторых случаях вы можете назвать функцию так же, как и программу, и она будет иметь приоритет, но ее можно переопределить.

Вот пример функции-оболочки, которая потребует тестирования и, возможно, некоторого дополнительного кода для обработки краевых случаев.и т. д.

#!/bin/bash
foo () {
    if [[ -p /dev/stdout ]]  # you don't want to pipe to less if you're piping to something else
    then
        command foo "$@" | less -F
    else
        command foo "$@"
    fi
}

Если вы используете такое же имя, как у меня в примере, это может привести к поломке вещей, которые ожидают другого поведения.Чтобы переопределить функцию для запуска основной программы, непосредственно перед ней введите command:

command foo

запустит foo без использования функции с тем же именем.

2 голосов
/ 13 ноября 2010

Как правило, автоматическое подключение к less требует, чтобы оболочка заранее знала о выводе, который будет создаваться командами, которые она запускает, - и людям достаточно сложно предсказать это, не пытаясь заставить программы делать это.

Вы могли бы написать оболочку, которая сделает это за вас - она ​​захватывает выходные данные (но как насчет stderr?) И разбивает на страницы, если это необходимо, но, скорее всего, это не будет стандартная оболочка.

2 голосов
/ 13 ноября 2010

Вы всегда можете направить на меньшее -E (это приведет к автоматическому завершению при меньшем выходе в конце файла) Для команд с коротким выводом это будет делать то, что вы хотите. Я не думаю, что вы можете автоматически переключаться на меньшее при большом количестве вывода.

1 голос
/ 07 марта 2012

Я написал эту функцию-обертку и поместил ее в свой .profile.Вы можете использовать это перед командой, и она автоматически направит ее на меньшее, если она длиннее 1 страницы.

lcmd ()
{
    echo "$("$@")" | less -F;
};

Так что lcmd ls будет ls текущий каталог и канал, который выводит на поменьше.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...