менее - quit-if-one-screen без - нет

hostname команда производит имя хоста системы от систем локальная конфигурация имени хоста (мог быть/etc/hostname или/proc/sys/kernel/hostname или другой в зависимости от ОС).

Команда ping -c 1 <hostname> движение должно выполнить поиск через libc сопоставитель (который может или не может быть DNS. например,/etc/hosts не является DNS) <hostname> указанный и затем выполняют обратный поиск DNS возвращенного IP-адреса и сообщают, что имя в выводе ping управляет.

Как конкретный пример, предположите, что локальное системное имя хоста является fred, как указано в /etc/hostname. hostname команда возвратит 'fred'. Команда ping -c 1 fred выполнит поиск DNS fred (любой просто fred или fred полностью определенный такой как fred.domain.com если домен по умолчанию domain.com). Предположите, что тот DNS возвращает IP-адрес x.x.x.x. ping затем выполнит обратный поиск DNS IP-адреса x.x.x.x, если никакое имя не возвращается ping произведет IP-адрес x.x.x.x, иначе ping произведет любое именованное, был возвращен из обратного поиска, который мог быть другим именем такой как ethel.domain.com.

32
31.12.2013, 20:24
4 ответа

Начиная с меньше 530 (выпущенный в декабре 2017), less --quit-if-one-screen не переключается на альтернативный экран, если он читает меньше чем один экранный. Таким образом, у Вас не будет этой проблемы, если Ваша версия меньшего будет достаточно последней.

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

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

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

#!/bin/sh
n=3  # number of screen lines that should remain visible in addition to the content
lines=
newline='
'
case $LINES in
  ''|*[!0-9]*) exec less;;
esac
while [ $n -lt $LINES ] && IFS= read -r line; do
  lines="$lines$newline$line"
done
if [ $n -eq $LINES ]; then
  { printf %s "$lines"; exec cat; } | exec less
else
  printf %s "$lines"
fi

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

#!/bin/sh
n=3  # number of screen lines that should remain visible in addition to the content
beginning=
newline='
'
# If we can't determine the terminal height, execute less directly
[ -n "$LINES" ] || LINES=$(tput lines) 2>/dev/null
case $LINES in
  ''|*[!0-9]*) exec less "$@";;
esac
# Read and display enough lines to fill most of the terminal
while [ $n -lt $LINES ] && IFS= read -r line; do
  beginning="$beginning$newline$line"
  printf '%s\n' -- "$line"
  n=$((n + 1))
done
# If the input is longer, run the pager
if [ $n -eq $LINES ]; then
  { printf %s "$beginning"; exec cat; } | exec less "$@"
fi
15
27.01.2020, 19:37
  • 1
    , "Меньше должно решить, использовать ли альтернативный экран, когда это запускается. Вы не можете задержать тот выбор к тому, когда он завершается". - хотя это, по-видимому, не делает этого, но не могло он просто задерживать любой вывод (такой как терминальные команды инициализации или фактические данные), пока это не получило X строк. Если stdin будет исчерпан, в то время как X <TERMINAL_LINES он просто вывел бы все на stdout и выходе, иначе он инициализирует альтернативный экран и сделает то, что он, как предполагается, делает –  ThiefMaster 09.01.2014, 10:06
  • 2
    , я закончил тем, что использовал измененную версию первого примера кода: gist.github.com/ThiefMaster/8331024 ($LINES был пуст при вызове как пейджер мерзавца и я думает, что Вы забыли увеличивать $n) –  ThiefMaster 09.01.2014, 11:01
  • 3
    @ThiefMaster спасибо за обратную связь. Обратите внимание, что необходимо поместить #!/bin/bash в Вашем сценарии, так как Вы используете определенную для удара конструкцию, поскольку это - Ваш сценарий, не будет работать над системами (такими как Ubuntu) где /bin/sh не удар. –  Gilles 'SO- stop being evil' 09.01.2014, 19:57
  • 4
    я действительно любил эту идею и разработал его немного далее (с большим количеством функций): github.com/stefanheule/smartless –  stefan 30.06.2015, 20:17
  • 5
    @ThiefMaster: less мог также (но не делает), имеют дополнительный способ выйти, где он печатает текущее содержание экрана после отправки нестроки инициализации. Таким образом, Вы могли обладать преимуществом альтернативного экрана, не создающего помехи scrollback, но все еще оставить соответствующую часть страницы справочника или безотносительно на терминале после выхода. –  Peter Cordes 09.06.2017, 11:14

Для медленных входов, таких как git log -Gregex, вы хотите, чтобы:

A) линии появлялись на главном экране по мере их поступления, а затем переключитесь на другой экран, как только понадобится прокрутка (чтобы первые $LINES вывода всегда отображались в прокрутке); если это так, используйте 2-ю из Gilles'овских ответов.

B) строк, которые будут отображаться на другом экране, но выйдите из другого экрана и распечатайте строки на главный экран, если прокрутка окажется ненужной (поэтому при прокрутке не будет выводиться никаких строк, если прокрутка понадобится); если это так, используйте скрипт, приведенный ниже:

Это тройник-вход во временный файл, затем, как только -менее выйдет из него cat-в временный файл, если он содержит меньше строк, чем высота экрана:

#!/bin/bash

# Needed so less doesn't prevent trap from working.
set -m
# Keeps this script alive when Ctrl+C is pressed in less,
# so we still cat and rm $TMPFILE afterwards.
trap '' EXIT

TXTFILE=$(mktemp 2>/dev/null || mktemp -t 'tmp')

tee "$TXTFILE" | LESS=-FR command less "$@"

[[ -n $LINES ]] || LINES=$(tput lines)
[[ -n $COLUMNS ]] || COLUMNS=$(tput cols)
# Wrap lines before counting, unless you pass --chop-long-lines to less
# (the perl regex strips ANSI escapes).
if (( $(perl -pe 's/\e\[?.*?[\@-~]//g' "$TXTFILE" | fold -w "$COLUMNS" | wc -l) < $LINES )); then
    cat "$TXTFILE"
fi

rm "$TXTFILE"

Используйте его с -экспортом PAGER='/путь/к/скрипту'. Этого должно быть достаточно, чтобы заставить git использовать его, если только вы уже не переопределили core.pager.

Для возможных улучшений смотрите также мою немного более плотную версию этого скрипта на: https://github.com/johnmellor/scripts/blob/master/bin/least

5
27.01.2020, 19:37

Это давно решено в дистрибутивах на основе Red Hat путем изменения поведения параметра -F в less исходном коде: см. этот патч из проекта Fedora, первая версия которого датируется 2008 годом. Идея состоит в том, чтобы просто получить высоту терминала (то есть максимальное количество строк, которые могут отображаться одновременно) и опустить последовательности инициализации и деинициализации, когда файл умещается на одном экране. Таким образом, нет необходимости в опции -X, а -F можно последовательно использовать независимо от длины файла.

4
27.01.2020, 19:37

Версия без GNU v. 530 включает патч Fedora -, на который ссылается @paul -antoine -arras, и больше не будет выводить последовательность инициализации терминала, когда используется --quit-if-one-screenи ввод подходит на одном экране.

13
27.01.2020, 19:37

Теги

Похожие вопросы