每次运行命令时 Bash 输出重定向到新文件

每次运行命令时 Bash 输出重定向到新文件

我有一个 Bash 单行代码,每次运行命令时,它都会将命令的输出重定向到一个新的新文件。记录每次运行命令的输出很重要(我ls在这里使用作为示例,但实际的命令是ansible-playbook而且不太可能是其他命令):

$ ls -hl | tee logs/$(date "+%Y-%m-%d_%H:%M:%S").log

这输入起来很麻烦并且很难记住,但它满足了我的要求(只要我每秒运行命令的次数不超过一次)。多次运行该命令将在/logs文件夹中生成日志,例如:

$ ls logs/
2018-12-21_10:28:20.log
2018-12-21_10:28:21.log
2018-12-21_10:31:11.log
2018-12-21_10:32:07.log

我想知道的是:是否有一个我不知道的现有 Bash 命令可以实现相同或非常相似的效果?日志名称的格式很重要(首选日期或 Unix 纪元)。

答案1

将其转换为 shell 函数:

dolog () {
    local logdir="${1:-$HOME/logs}"
    mkdir -p "$logdir" &&
    tee "$logdir/$(date "+%F_%T").log"
}

这将进入您的~/.bashrc文件,并将在下一个新的交互式 shell 中处于活动状态。

该函数可以通过两种方式使用:

utility | dolog

这会将输出保存到~/logs.

utility | dolog /some/path

这会将输出保存到下面的日期文件中/some/path(使用.将日志保存在当前目录中)。如果该目录/some/path(或~/logs在第一个示例中)不存在,则会创建该目录。

稍微更高级的版本,如果由于某种原因(无法创建目录,或者无法写入日志文件)而无法将数据写入日志文件,则将恢复为仅将数据传递到标准输出。这可以确保在出现日志记录问题时,正在通过管道传输的命令不会终止。

dolog () {
    local logdir="${1:-$HOME/logs}"

    mkdir -p "$logdir" && tee "$logdir/$(date "+%F_%T").log" || cat
}

例子:

$ touch ~/logs  # this creates a file in my home directory
$ ls -l | dolog
mkdir: /home/myself/logs: Not a directory
total 0
-rw-r--r--  1 myself  staff  0 Dec 21 13:08 logs

相关内容