echo "nonsense: error: positive numbers are required for argument 1" >&2
dribbler -s 0.4 -r 0.1 -i data -t
echo "apoplexy: unforeseen problems induced temporary amnesia" >&2
你可以使用cat data来代替dribbler命令。dribbler命令从data中读取行,将它们写入标准输出,行与行之间具有高斯分布的随机延迟。平均延迟为0.4秒;标准偏差是0.1秒。2另外两行是假装向标准误差报告错误的命令。 我的data文件包含了一首无意义的“诗”,名为'The Great Panjandrum'。 有了这个背景,我们可以运行命令并捕获log.file中的真实的时间,删除(忽略)用户和系统时间值,同时使用以下命令将其余的标准误差发送到标准误差:
$ (time my_command) 2> >(tee raw.stderr | time.filter >&2)
nonsense: error: positive numbers are required for argument 1
So she went into the garden
to cut a cabbage-leaf
to make an apple-pie
and at the same time
a great she-bear coming down the street
pops its head into the shop
What no soap
So he died
and she very imprudently married the Barber
and there were present
the Picninnies
and the Joblillies
and the Garyulies
and the great Panjandrum himself
with the little round button at top
and they all fell to playing the game of catch-as-catch-can
till the gunpowder ran out at the heels of their boots
apoplexy: unforeseen problems induced temporary amnesia
$ cat log.file
0m7.278s
1条答案
按热度按时间envsm3lx1#
time
命令比较复杂。time
的POSIX规范没有定义默认的输出格式,但是为-p
(可能是'POSIX')选项定义了一种格式。请注意管道中对命令序列的讨论(不容易理解)。Bash规范说
time
在'pipeline'前面加了前缀,这意味着time cmd1 | cmd2
乘以cmd1
和cmd2
,它将结果写入标准误差。Korn shell也是类似的。POSIX格式要求在标记(如
real
)和时间之间有一个空格;默认格式通常使用制表符而不是空格。注意/usr/bin/time
命令可能还有另一种输出格式。例如,在macOS上,它在一行中列出3个时间,默认情况下,标签在时间值之后;它支持-p
以近似于POSIX格式的格式打印(但在标签和时间之间有多个空格)。您可以轻松地将写入标准错误的所有信息写入一个文件:
如果
my_command
或它调用的任何程序向标准错误报告任何错误,这些错误也会被记录到日志文件中,并且time
输出的所有三行都会被写入到文件中。如果您的shell是Bash,则可以使用进程替换来过滤一些输出。
我不会用一个命令行来尝试;使其工作所需的象形文字是可怕的,最好封装在shell脚本中。
例如,shell脚本
time.filter
捕获time
的输出,并仅将real
时间写入日志文件(默认值为log.file
,可通过提供替代日志文件名作为第一个参数进行配置这里假设您的
sed
使用-E
来启用扩展正则表达式。它接受可选的分钟值,如60m05.003s
,或者只接受秒值5.00s
,或者5.0
(POSIX格式-小数点后至少需要一位数字)。它捕获时间部分并将其打印到所选文件(默认为log.file
;您可以在命令行中指定一个替代名称作为第一个参数)。注意,即使是GNUsed
也会将w
命令后面的所有内容都视为文件名;你必须在新行上继续d
(删除)命令和右大括号}
。GNUsed
不要求在d
后面有分号; BSD(macOS)sed
可以。第二行识别并删除在user
和sys
时间中报告的行。其他所有内容都原样通过。该脚本处理您在日志文件名之后给予的任何文件,如果您没有提供任何文件,则处理标准输入。更好的命令行表示法是使用显式选项(
-l logfile
)和getopts
来指定日志文件。有了这些,我们就可以设计一个报告标准错误和标准输出的程序-
my_command
:你可以使用
cat data
来代替dribbler
命令。dribbler
命令从data
中读取行,将它们写入标准输出,行与行之间具有高斯分布的随机延迟。平均延迟为0.4秒;标准偏差是0.1秒。2另外两行是假装向标准误差报告错误的命令。我的
data
文件包含了一首无意义的“诗”,名为'The Great Panjandrum'。有了这个背景,我们可以运行命令并捕获
log.file
中的真实的时间,删除(忽略)用户和系统时间值,同时使用以下命令将其余的标准误差发送到标准误差:(The所需时间通常在6到8秒之间。有17行,所以如果每行0.4秒,您预计大约需要6.8秒。)空白行来自
time
;删除空行是非常困难的,而且只能删除空行,特别是POSIX规定它是可选的,不值得这样做。