将命令输出复制到文件,但让他们相信他们正在写一个终端

时间:2016-02-20 11:44:43

标签: shell command-line terminal

要复制从shell启动的命令输出,我使用

exec > >(tee myfile)

然后下一个命令将被记录到文件中。

问题是命令知道输出不再是终端。所以他们可以改变他们的展示方式。例如,使用命令ls启用重定向时,输出仅显示在一列中。

我知道当我使用烟斗时我可以使用unbuffer,但这不是我想要的。我希望能够记录我的shell中的所有输出。

1 个答案:

答案 0 :(得分:2)

您可以使用script将所有输出复制到文件(通常为typescript)。它不会干扰程序,允许它认为它正在写入终端。

该程序可用"无处不在",但有些选项不同:

我遇到的主要区别是如何指定输出文件名和命令。使用Linux,您可以将命令作为选项提供,而在OSX中,命令包含超过文件名的参数。在Linux上使用-c选项时,请记住script使用SHELL环境变量标识的shell运行此选项。那实际上可能是"任何"程序(我使用过文本编辑器)。运行shell来执行命令意味着它可能使用新的环境变量(通常不是问题)。

如果不使用-c选项,script将启动一个新shell,将所有内容写入其输出,直到退出该shell。要像重定向一样使用它,你可以创建一个像

这样的别名
alias redir=`script myfile'

写入 myfile

alias redir='script -a myfile'

追加 myfile 。在任何一种情况下,退出shell(按 control D 或键入exit)将结束"重定向"。

enter image description here

ls(忽略终端数据库)外,大多数程序都使用TERM环境变量。您可能在初始化shell时执行了一些不寻常的操作,因此运行script会将TERM重新初始化为与当前使用的不同的值。要看到这一点,你可以做类似

的事情
env >before.log
script -c "env >after.log"
diff before.log after.log