Эмуляторы терминала, очевидно, сохраняют часть истории вывода любой команды в буфере. Мы знаем это, потому что, например, в gnome-terminal
справа есть полосы прокрутки, и мы можем прокрутить назад и посмотреть «историю» команд, которые мы ввели, с ограничением строк прокрутки.
Есть ли способ получить доступ к этой буферизованной информации и использовать ее из команды оболочки?
Я не мертвый установлен на 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, которую можно использовать аналогичным образом, или эмулятор терминала, у которого есть требуемая функция?