Как я могу сохранить содержимое, которое я читал от человека после того, как я ушел?

24

Таким образом, мы используем, man whateverчтобы получить информацию об использовании команды и другую информацию whatever, когда соответствующий раздел информации найден, я бы хотел выйти из manкоманды, оставив информацию на экране. Поэтому я могу набрать следующую команду с рефери выше. Но manкоманда покидает весь экран, чтобы восстановить старый экран, похожий на vim. Есть ли способ добиться этого?

NathaneilCapital
источник
Все предложения хороши, но вы также можете просто открыть второе окно для просмотра справочной страницы. И, вероятно, есть также просмотрщики страниц с графическим интерфейсом.
Бармар

Ответы:

38

Я считаю, что это не столько manсамо по себе, сколько о вашем предпочтительном пейджере ( PAGERпеременная окружения) в сочетании с используемым терминалом.

Я думаю, твой пейджер, вероятно, less (типичный пейджер по умолчанию в настоящее время и соответствует описанию).

lessимеет опцию, -Xкоторая может привести вас в соответствие с тем, что вы ищете.

   -X or --no-init
          Disables sending the termcap initialization and deinitialization
          strings  to  the  terminal.   This is sometimes desirable if the
          deinitialization string does something unnecessary, like  clear‐
          ing the screen.

Например, PAGER="less -X" man manего можно использовать для тестирования, и если вы считаете, что такое поведение предпочтительнее, вы можете установить PAGERпостоянное значение этого значения.

Хокан Линдквист
источник
К сожалению, это портит историю прокрутки.
MusiKk
@musiKk Хорошо работает для меня в Ubuntu 16.04 с умным терминалом Unicode (не с консолью Linux) и man 2.7.5
кошка
3
@musiKk: если вы хотите иметь возможность прокручивать страницу руководства после выхода из пейджера, вы должны ограничиться прокруткой вперед на странице руководства (по строкам или страницам), а не обычным произвольным доступом.
Питер Кордес
1
Или вы можете использовать LESS=-X, чтобы избежать необходимости изменять PAGER(я не доверяю ему на 100%, чтобы он работал во всех программах с таким пробелом, хотя это работает в человеке.)
Random832
11

Если вы используете меньше как ваш пейджер (что очень распространено), вам не нужно заниматься модификацией вашего пейджера, просто перенаправьте ввод / вывод:

man <whatever you want to man> | cat -

Это распечатает копию на терминал, так что вы можете прокрутить вверх, когда вам это нужно.

Бреннен Смит
источник
1
Одна из проблем, связанных с этим подходом, заключается в том, что при использовании длинных страниц справочника может быть трудно прокрутить назад до интересующей вас части, и вы не увидите ни эту часть, ни текущую командную строку.
Jlliagre
Ни одно из других предложений не решает эту проблему - оно присуще только одному окну консоли. Но с учетом всего сказанного вы всегда можете написать свою команду, прокрутить немного вверх и прокрутить назад до своей наполовину написанной команды.
Бреннен Смит
Мое предложение определенно преодолевает эту проблему. Вы оставляете команду man, когда интересующая вас страница справочника находится на экране, и вы можете ввести свою команду, пока эта страница все еще видна на том же экране.
Jlliagre
2
-означает стандарт в, но catпредполагает, что в любом случае
loa_in_
1
Это в основном из-за семантики - мне всегда нравится быть явным с stdin.
Бреннен Смит
5

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

Эти команды smcupи rmcup, которые были предназначены для включения и перемещения, где cupкоманда (позиция курсора) была разрешена.

Вот функция оболочки, которую я использовал для автоматизации задачи, она работает по крайней мере с Solaris и, вероятно, с большинством дистрибутивов Linux:

fixterminfo()
{
  (
    [[ ! -d /tmp/terminfo ]] && { mkdir /tmp/terminfo || return ; }
    cd /tmp/terminfo || return
    TERM=xterm infocmp > xterm.src.org
    sed -e 's/rmcup=[^,]*,//'  -e 's/smcup=[^,]*,//' xterm.src.org > xterm.src
    if diff xterm.src.org xterm.src
    then
      echo xterm terminfo already patched
      return
    fi
    TERMINFO=/tmp/terminfo tic xterm.src
    if [ -f /usr/share/lib/terminfo/x/xterm ] ; then
      XTERM=/usr/share/lib/terminfo/x/xterm
    else
      if [ -f /lib/terminfo/x/xterm ] ; then
        XTERM=/lib/terminfo/x/xterm
      else
        if [ -f /usr/share/terminfo/x/xterm ] ; then
          XTERM=/usr/share/terminfo/x/xterm
        else
          echo xterm terminfo not found ; return
        fi
      fi
    fi
    if [ ! -f ${XTERM}.org ]
    then
      sudo cp ${XTERM} ${XTERM}.org || return
    fi
    cat /tmp/terminfo/x/xterm | sudo dd of=${XTERM}
  )
}

Если ваша запись терминала не является резервной xterm, вам следует заменить xtermна правильное имя терминала в скрипте.

jlliagre
источник
1
Да, но тогда это нарушает другие программы (не обязательно пейджеры или проклятия, но редакторы, похожие на readline и т. Д.)
кошка,
1
@cat Не то чтобы я проверял какой-либо существующий, но я никогда не замечал никаких проблем с другими программами после использования этого обходного пути. У вас есть примеры программ, которые ведут себя странно? Я также подозреваю, что если они потерпят неудачу, это проблема на их стороне. Предполагается, что эмулятор терминала не поддерживает все возможности terminfo. Он просто рекламирует, какие из них поддерживает, и дело за приложением, чтобы справиться с ним.
Jlliagre
3

Вы можете направить вывод в catкоманду

man man|cat

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

PAGER=cat man man
SimoneLazzaris
источник
2

Без модификации пейджера, решение с каналами, которые могут работать в большинстве сред:

Примеры для man ls

  • Оставьте всю справочную страницу на экранеman ls | cat
  • Прочитайте постраничный вывод man , с возможностью оставить его в любое время с помощью q :man ls | more
  • фильтруйте содержимое man с шаблоном и сохраняйте совпадающие строки на экране:man ls | grep somestring
marcanuy
источник
-3

это 2016, просто откройте второй терминал или вкладку или окно или прочитайте человека онлайн.

user362328
источник
И это очевидное практическое решение.
Брайам
1
@Braiam Непрактично, если терминал находится на экране мобильного телефона.
NathaneilCapital
@NathaneilCapital Похоже, пришло время изучать tmux.
Майкл Хэмптон
-3

Даже на своих серверах (FreeBSD) я устанавливаю X и xfce. Затем я выделяю большой буфер (например, 10 000 строк) для эмуляторов терминала, чтобы я мог полностью прокрутить man-страницу в одной из них и использовать отдельный экземпляр терминала для сборки команды. Работает угощение.

MMacD
источник