我有一个 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