Как я могу получить доступ к истории вывода моей оболочки или терминала-эмулятора? - PullRequest
1 голос
/ 11 мая 2019

Эмуляторы терминала, очевидно, сохраняют часть истории вывода любой команды в буфере. Мы знаем это, потому что, например, в gnome-terminal справа есть полосы прокрутки, и мы можем прокрутить назад и посмотреть «историю» команд, которые мы ввели, с ограничением строк прокрутки.

scroolback

Есть ли способ получить доступ к этой буферизованной информации и использовать ее из команды оболочки? Я не мертвый установлен на gnome-terminal в качестве эмулятора. Любой из широко используемых, достойно представленных, которые могут это сделать, подойдет.

Теперь я могу просто повторить команду, т.е. сделать что-то вроде echo "$(!!)". Но это имеет два ограничения:

  • Команда выполняется снова со всеми побочными эффектами, затрачивая время и ресурсы. (что раздражает для длительных команд)
  • Выходные данные команды могут измениться при повторных запусках (например, date)

Вот пример терминальной сессии, которая иллюстрирует то, что я хочу:

confus@confusion6 ~/devel/dmenu master $ ls
LICENSE   config.def.h  dmenu.c     dmenu_run  stest    util.c
Makefile  config.h      dmenu.o     drw.c      stest.c  util.h
README    config.mk     dmenu.1     drw.h      stest.o  util.o
arg.h     dmenu         dmenu_path  drw.o      stest.1  safe.c

confus@confusion6 ~/devel/dmenu master $ make
dmenu build options:
CFLAGS   = -std=c99 -pedantic -Wall -Os -I/usr/X11R6/include -I/usr/include/freetype2 -D_DEFAULT_SOURCE -D_BSD_SOURCE -D_XOPEN_SOURCE=700 -D_POSIX_C_SOURCE=200809L -DVERSION="4.9" -DXINERAMA
LDFLAGS  = -L/usr/X11R6/lib -lX11 -lXinerama -lfontconfig -lXft
CC       = cc

confus@confusion6 ~/devel/dmenu master $ date
Sa May 11 16:28:08 CEST 2019

confus@confusion6 ~/devel/dmenu master $ get_output_buffer | grep -i sa  # Does not re-run the commands!
arg.h     dmenu         dmenu_path  drw.o      stest.1  safe.c
Sa May 11 16:28:08 CEST 2019

Здесь мнимая функция get_outpuf_buffer будет обращаться к выходному буферу терминала и печатать его в stdout для дальнейшей обработки. Может быть, есть встроенная функция bash, которую можно использовать аналогичным образом, или эмулятор терминала, у которого есть требуемая функция?

1 Ответ

1 голос
/ 11 мая 2019

Один из вариантов - использовать инструмент tee перед всеми вашими командами.Таким образом, вы можете сохранить все свои выходные данные в выбранном файле.См. Пример ниже, где я сохраняю весь вывод в текстовый файл с именем log.txt:

bash | tee log.txt
echo 'hello world'
cat log.txt

. Вы можете выйти из нового сеанса BASH с помощью сочетания клавиш CTRL + D или exit, когда высделано.

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