【问题标题】:Send output of last command to a file automatically in bash?在bash中自动将最后一个命令的输出发送到文件?
【发布时间】:2013-12-27 22:22:05
【问题描述】:

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

【问题讨论】:

    标签: macos bash shell


    【解决方案1】:

    使用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 命令更安全。

    【讨论】:

    • 谢谢,正是我想要的!
    【解决方案2】:

    如果不重新运行命令,则无法保存上一条命令的输出逐字,但是可以用鼠标标记终端的内容并粘贴在大多数终端中,使用鼠标中键(或 Shift+Insert)将其复制到文件中。要再次运行命令并保存标准输出,您可以这样做:

    !! > command.log
    

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

    !! > command.log 2>&1
    

    【讨论】:

    • 也许我不清楚。我更多地考虑了一些 bash_profile 代码,这些代码基本上会将“| tee filename”附加到我所做的每个命令中,以便自动记录输出但也会显示。因此,如果我发现我想更深入地查看输出,我可以打开我的文件,它就会在那里。
    • “每个命令”确实与“我最近的命令”非常不同。
    【解决方案3】:

    如果您不关心生成的文件大小,您可以轻松做到这一点:

    bash | tee /tmp/bash.history.log
    

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

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

    创建一个命名的 FIFO 管道

    mkfifo /tmp/bash.history.fifo
    

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

    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 删除。

    【讨论】:

      猜你喜欢
      • 2016-12-14
      • 2011-08-22
      • 2014-08-08
      • 1970-01-01
      • 2014-11-28
      • 1970-01-01
      • 1970-01-01
      • 2011-12-22
      相关资源
      最近更新 更多