要复制从shell启动的命令输出,我使用
exec > >(tee myfile)
然后下一个命令将被记录到文件中。
问题是命令知道输出不再是终端。所以他们可以改变他们的展示方式。例如,使用命令ls
启用重定向时,输出仅显示在一列中。
我知道当我使用烟斗时我可以使用unbuffer
,但这不是我想要的。我希望能够记录我的shell中的所有输出。
答案 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
)将结束"重定向"。
除ls
(忽略终端数据库)外,大多数程序都使用TERM
环境变量。您可能在初始化shell时执行了一些不寻常的操作,因此运行script
会将TERM
重新初始化为与当前使用的不同的值。要看到这一点,你可以做类似
env >before.log
script -c "env >after.log"
diff before.log after.log