如何访问外壳程序或终端仿真器的输出历史记录?

时间:2019-05-11 14:50:21

标签: bash terminal buffer gnome-terminal terminal-emulator

终端仿真器显然会将任何命令的输出历史记录的一部分保存在缓冲区中。我们知道这一点,因为在gnome-terminal中,右侧有滚动条,我们可以向后滚动并查看输入的命令的“历史记录”,其中包含有限的滚动行。

scroolback

是否可以通过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内置功能可以类似使用,或者具有我想要的功能的终端仿真器?

1 个答案:

答案 0 :(得分:1)

一种选择是在所有命令之前使用NAME READY STATUS RESTARTS AGE hello-kerb-6f744b6cc5-x6dw6 1/1 Running 0 6m 工具。这样,您可以将所有输出存储在选定的文件中。请参见下面的示例,在该示例中,我将所有输出保存到名为tee的文本文件中:

log.txt

完成后,您可以使用CTRL + D或bash | tee log.txt echo 'hello world' cat log.txt 退出新的BASH会话。