bash shell在哪里存储实际的终端会话?我想阅读以前使用的命令的输出。我能找到的所有信息都是如何存储命令的输出。
由于输出显示在屏幕上,因此无论如何都必须将其存储在某个地方。所以我的问题是:在哪里?
bash shell在哪里存储实际的终端会话?我想阅读以前使用的命令的输出。我能找到的所有信息都是如何存储命令的输出。
由于输出显示在屏幕上,因此无论如何都必须将其存储在某个地方。所以我的问题是:在哪里?
Answers:
Bash仅存储您运行的命令的历史记录(您可以通过键入来检索历史记录history
)。除非您已经将回滚设置为一个很高的数字,否则无法查看比回滚设置值还早的输出。另外,将此值设置为很高的数字会使滚动速度变慢,因为这些行已存储在内存中。
要存储将来的命令及其输出,有几种选择:
使用 screen
输入,开始一个屏幕会话screen
。进入屏幕后,按Ctrl- a,然后按:,然后输入log
。所有I / O都将捕获在screenlog
启动screen
命令的目录中的文件中。
使用 script
您可以从输入开始script
。一个脚本会话将启动,将捕获所有的I / O到一个指定的文件typescript
。您可以script
通过Ctrl- 退出会话,d 然后查看typescript
文件中的日志。
使用 tee
tee是一个方便的工具。您可以执行以下操作:
$ bash | tee log.txt
这将在您已经在运行的外壳中打开一个新的bash外壳。当您exit
完成此操作后,您可以在名为的文件中看到输出log.txt
其他方法
正如Dustin Kirkland在这篇文章中建议的那样,您也可以使用byobu。尽管我从未使用过,但诸如Shelr之类的终端截屏工具听起来也像一个选择。
有很多与此问题有关的问题,但是所有这些问题都以(未记录)输出的正确假设开始。
所以我的问题是:在哪里?
无处:不记录Bash(以及我所知道的任何其他shell)的输出。
由于输出显示在屏幕上,因此无论如何都必须将其存储在某个地方。
它是,但很可能不是纯文本格式,甚至不是在磁盘上(尽管这实际上取决于终端仿真器):最有可能且至少在大多数情况下,在终端仿真器分配的内存段中。
但是,可以肯定的是,它没有记录到文件中,至少不是通过外壳程序记录的,而且我不知道终端模拟器默认将输出记录到文件中。
的确,这并不意味着不可能记录终端输出:首先,我会提到我认为很多人都没有意识到的事情,因为至少在Ask Ubuntu上我从未见过有人提及此事:Konsole允许保存回滚到文件(也许还有其他终端仿真器提供这种功能,Konsole只是我所知道的唯一一个),尽管这受Konsole的回滚大小限制的限制。
不过,这通常并不是很有用,并且您很可能希望研究“适当的”解决方案以将整个会话的输出记录到文件中(如何在终端会话中记录所有输入和输出?以及Ron的答案)。
这与您的shell(bash
)没有关系,它是您所使用的终端仿真器的功能。它存储在终端的“回滚缓冲区”中。我还没有找到关于此内容确切存储位置的清晰说明,但是个人经验告诉我,它存储在中的某个位置/tmp
。
就像上面链接的问题的答案所暗示的那样,它很可能存储在无名文件中。要了解我的意思,请使用文本编辑器打开一个新文件:
gedit newfile
在文件中写一行文本并保存。现在,在该文件仍然打开的同时,打开一个终端并删除它:
rm newfile
由于您仍在中打开文件gedit
,因此可以继续写入。即使文件已被删除,您甚至可以向其中写入几GB的数据。那是因为删除文件只是删除指向其inode的链接。如果其文件描述符由另一个程序保持打开状态,则可以向其中写入数据,这可以避免以下事实:不再有与文件系统上的文件描述符相对应的实际链接(文件)。
这就是说,您的终端历史记录可能是使用这样的技巧保存的,该技巧位于中的已删除文件中/tmp
。您可能真正想要的是简单地增加终端模拟器的回滚缓冲区大小,以便您可以向上滚动并查看它。具体操作方法取决于您使用的终端仿真器。大多数都具有允许您进行此操作的命令行开关,许多还具有GUI设置方式。例如,在gnome-terminal
(Ubuntu上的默认设置)中,它是编辑->首选项->配置文件---单击您的配置文件->编辑->滚动->将滚动限制为NNN:
script
按照接受的答案中的说明进行操作。