【发布时间】:2013-12-27 22:22:05
【问题描述】:
在 OSX 上使用 bash。如何设置我的 shell,以便它用我最近的命令的输出覆盖某个文件?这对于查看/搜索/分析大型输出非常方便,我没有先见之明通过管道传输到文件。感谢您的帮助!
【问题讨论】:
在 OSX 上使用 bash。如何设置我的 shell,以便它用我最近的命令的输出覆盖某个文件?这对于查看/搜索/分析大型输出非常方便,我没有先见之明通过管道传输到文件。感谢您的帮助!
【问题讨论】:
使用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 命令更安全。
【讨论】:
如果不重新运行命令,则无法保存上一条命令的输出逐字,但是可以用鼠标标记终端的内容并粘贴在大多数终端中,使用鼠标中键(或 Shift+Insert)将其复制到文件中。要再次运行命令并保存标准输出,您可以这样做:
!! > command.log
要将标准错误也保存到同一文件中:
!! > command.log 2>&1
【讨论】:
如果您不关心生成的文件大小,您可以轻松做到这一点:
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 删除。
【讨论】: