如何将 time 命令的输出重定向到 Linux 中的文件?
- 2024-10-12 10:28:00
- admin 原创
- 98
问题描述:
关于 Linux 上计时程序的一个小问题:time 命令可以测量程序的执行时间:
[ed@lbox200 ~]$ time sleep 1
real 0m1.004s
user 0m0.000s
sys 0m0.004s
效果很好。但如果我尝试将输出重定向到文件,则会失败。
[ed@lbox200 ~]$ time sleep 1 > time.txt
real 0m1.004s
user 0m0.001s
sys 0m0.004s
[ed@lbox200 ~]$ cat time.txt
[ed@lbox200 ~]$
我知道还有其他使用选项 -o 来写入文件的时间实现,但我的问题是关于没有这些选项的命令。
有什么建议吗?
解决方案 1:
尝试
{ time sleep 1 ; } 2> time.txt
将“time”的 STDERR 和你的命令合并到 time.txt 中
或者使用
{ time sleep 1 2> sleep.stderr ; } 2> time.txt
将“sleep”的 STDERR 放入文件“sleep.stderr”,并且只有“time”的 STDERR 放入“time.txt”
解决方案 2:
很简单。GNUtime
实用程序有一个选项。
但你必须确保你没有使用 shell 的内置time
命令,至少bash
内置命令不提供该选项!这就是为什么你需要提供该time
实用程序的完整路径:
/usr/bin/time -o time.txt sleep 1
解决方案 3:
time
将您正在计时的命令包裹在一组括号中。
例如,以下将计时ls
的结果ls
和计时的结果写入outfile
:
$ (time ls) > outfile 2>&1
或者,如果您想将命令的输出与捕获的输出分开time
:
$ (time ls) > ls_results 2> time_results
解决方案 4:
如果您关心命令的错误输出,您可以像这样将它们分开,同时仍然使用内置的时间命令。
{ time your_command 2> command.err ; } 2> time.log
或者
{ time your_command 2>1 ; } 2> time.log
如您所见,命令的错误转到一个文件(因为stderr
用于time
)。
不幸的是,你不能将它发送到另一个句柄(如3>&2
),因为它在{...}
也就是说,如果您可以使用 GNU 时间,只需按照@Tim Ludwinski 所说的操作即可。
ime -o time.log command
解决方案 5:
由于time命令的输出是错误输出,因此将其重定向为标准输出将更直观地进行进一步的处理。
{ time sleep 1; } 2>&1 | cat > time.txt
解决方案 6:
如果你使用的是 GNU 时间而不是内置的 bash,请尝试
time -o outfile command
(注意:GNU 时间格式与内置的 bash 略有不同)。
解决方案 7:
&>out time command >/dev/null
你的情况
&>out time sleep 1 >/dev/null
然后
cat out
解决方案 8:
我最终使用了:
/usr/bin/time -ao output_file.txt -f "Operation took: %E" echo lol
其中“a”是附加
其中“o”前面是要附加到的文件名
其中“f”是采用类似 printf 语法的格式
其中“%E”表示 0:00:00;小时:分钟:秒
我必须调用 /usr/bin/time,因为 bash “time” 正在践踏它并且没有相同的选项
我只是想将输出输出到文件,与 OP 不同
解决方案 9:
#!/bin/bash
set -e
_onexit() {
[[ $TMPD ]] && rm -rf "$TMPD"
}
TMPD="$(mktemp -d)"
trap _onexit EXIT
_time_2() {
"$@" 2>&3
}
_time_1() {
time _time_2 "$@"
}
_time() {
declare time_label="$1"
shift
exec 3>&2
_time_1 "$@" 2>"$TMPD/timing.$time_label"
echo "time[$time_label]"
cat "$TMPD/timing.$time_label"
}
_time a _do_something
_time b _do_another_thing
_time c _finish_up
这样做的好处是不会产生子 shell,并且最终管道的 stderr 会恢复为真正的 stderr。
解决方案 10:
如果你不想触及原始进程的 stdout 和 stderr,你可以将 stderr 重定向到文件描述符 3 并返回:
$ { time { perl -le "print 'foo'; warn 'bar';" 2>&3; }; } 3>&2 2> time.out
foo
bar at -e line 1.
$ cat time.out
real 0m0.009s
user 0m0.004s
sys 0m0.000s
您可以将其用于包装器(例如 cronjobs)来监视运行时:
#!/bin/bash
echo "[$(date)]" "$@" >> /my/runtime.log
{ time { "$@" 2>&3; }; } 3>&2 2>> /my/runtime.log
解决方案 11:
如果您正在使用,csh
则可以使用:
/usr/bin/time --output=outfile -p $SHELL -c 'your command'
例如:
/usr/bin/time --output=outtime.txt -p csh -c 'cat file'
解决方案 12:
如果你只想要shell 变量中的时间,那么可以这样做:
var=`{ time <command> ; } 2>&1 1>/dev/null`
- 2024年20款好用的项目管理软件推荐,项目管理提效的20个工具和技巧
- 2024年开源项目管理软件有哪些?推荐5款好用的项目管理工具
- 项目管理软件有哪些?推荐7款超好用的项目管理工具
- 项目管理软件哪个最好用?盘点推荐5款好用的项目管理工具
- 项目管理软件有哪些最好用?推荐6款好用的项目管理工具
- 项目管理软件有哪些,盘点推荐国内外超好用的7款项目管理工具
- 2024项目管理软件排行榜(10类常用的项目管理工具全推荐)
- 项目管理软件排行榜:2024年项目经理必备5款开源项目管理软件汇总
- 2024年常用的项目管理软件有哪些?推荐这10款国内外好用的项目管理工具
- 项目管理必备:盘点2024年13款好用的项目管理软件