在bash中自动将最后一个命令的输出发送到文件?

时间:2013-12-27 22:22:05

标签: macos bash shell

在OSX上使用bash。如何设置我的shell,以便用我最近命令的输出覆盖某个文件?这对于查看/搜索/分析我没有预见到管道到文件的大输出非常方便。谢谢你的帮助!

3 个答案:

答案 0 :(得分:4)

使用script,您的命令及其输出将存储在日志文件中,直到您退出script

script mylogfile.output

运行此命令后,您将返回bash命令提示符,并且可以正常继续bash会话。所有命令和输出都保存到“mylogfile.output”。

您可以将它放在〜/ .bashrc文件中,以便它自动启动,如下所示:

[ -n "$PS1" -a -z "$SCRIPT_STARTED" ] || export SCRIPT_STARTED=$$
[ "$SCRIPT_STARTED" -eq $$ ] && script -q ~/mylogfile.output

“-q”选项使其安静地启动,这对~/.bashrc命令更安全。

答案 1 :(得分:1)

您无法在不重新运行命令的情况下保存最后一个命令 verbatim 的输出,但您可以使用鼠标标记终端的内容并粘贴它在大多数终端中使用鼠标中键(或 Shift + 插入)到文件中。要再次运行命令并保存标准输出,您可以执行以下操作:

!! > command.log

还要将标准错误保存到同一文件中:

!! > command.log 2>&1

答案 2 :(得分:0)

如果您不关心产生的文件大小,您可以轻松地执行此操作:

bash | tee /tmp/bash.history.log

此命令生成子shell并将该shell的stdout复制到指定的文件。当然,这个文件包含了所有内容,而不仅仅是最新的命令。但是,我认为这种行为可能(就像@ John1024给出的script答案)更有帮助,因为你必须非常小心,不要在你感兴趣的那个之后输入另一个shell命令,因为那个动作会实际上覆盖了它。 : - )

如果您想拥有某种旋转历史,您可以尝试以下方法(诚然相当笨拙):

创建一个命名的FIFO管道

mkfifo /tmp/bash.history.fifo

启动从该FIFO读取的后台进程并将输出拆分为split命令:

split -a 5 -u -b 1000000 /tmp/bash.history.fifo /tmp/bash.history.

然后像以前一样启动子shell,但使用FIFO作为文件目标:

bash | tee /tmp/bash.history.fifo

这将提供一系列文件/tmp/bash.history.aaaaa/tmp/bash.history.aaaab等等,每个文件大小约为1MB。现在,您可以轻松定义CRON作业,清除所有早于以下文件的文件。 24小时。通过这种方式,您可以获得在该时间范围内所做的完整历史记录。当然,如果分割出有趣的输出,您可能需要查看更多文件。

并且,正如本文所提出的所有解决方案一样,您可能需要花一点时间考虑安全性,因为所有输出到标准文件的输出都可能对其他人可读(给出主目录的默认umask)。可以通过将管道和日志文件移动到主目录的子目录来解决后一个问题,从该目录中删除对other以及group的读取和执行权限。