【发布时间】:2019-09-29 04:16:49
【问题描述】:
终端模拟器显然会将任何命令的一部分输出历史记录保存在缓冲区中。我们知道这一点,因为,例如在gnome-terminal 右侧有滚动条,我们可以向后滚动并查看我们输入的命令的“历史记录”,但滚动行数有限。
有没有办法访问这些缓冲信息并在 shell 命令中使用它?
我并没有死心塌地将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 内置功能或具有我想要的功能的终端模拟器?
【问题讨论】:
-
你能从你的
.bashrc运行script吗?见unix.stackexchange.com/q/200637/133219。还有 google tmux、screen 和 xclip。 -
script有一个小缺点,你不能做像cat script这样的事情,基本上是写一个无限大小的文件并阻塞shell。它还会复制数据而不是在已经存在的回滚缓冲区上绘图。据我所知, tmux 和 screen 不会从正在运行的 shell 中授予缓冲区访问权限。但是这个建议很好。我不知道script。
标签: bash terminal buffer gnome-terminal terminal-emulator