gpt4 book ai didi

bash - 什么是 shell 脚本计时 ** 自身 ** (真的)的优雅方式?

转载 作者:行者123 更新时间:2023-11-29 09:18:40 32 4
gpt4 key购买 nike

我有一个 bash 脚本,称之为 Exp,它执行计算实验,我想结果为

time Exp

在脚本本身中:首先它需要始终完成(并依赖于键入“time Exp”还不够——对于您(或用户!!)需要它的关键情况,它将是忘记了),其次,脚本 Exp 本身需要将其存储在文件中。

编写包装脚本(称为“time Exp”)似乎可以使普通工作由于时间命令破坏了参数和输入/输出,所以 Exp 不可能。

但实际上所需要的只是访问那个通用的 Exp 本身的数据只是按时间打印出来的record(也可以用ps访问)!这就是为什么我要求一个“优雅”的解决方案,而不仅仅是首先以某种方式存储日期在 Exp 中,最后,在退出之前,计算差异。但只是模拟什么时间命令在 Exp 中执行。我认为这在许多其他方面会有用情况。

最佳答案

因为 POSIX 定义了 time实用程序将其结果写入标准错误,您唯一需要注意的技巧是 bash 内置 time 的行为略有不同。

$ time sleep 1

real 0m1.004s
user 0m0.001s
sys 0m0.002s
$ time sleep 1 2>xyz

real 0m1.005s
user 0m0.001s
sys 0m0.003s
$ (time sleep 1) 2>xyz
$ cat xyz

real 0m1.005s
user 0m0.001s
sys 0m0.002s
$ /usr/bin/time sleep 1 2>xyz
$ cat xyz
1.00 real 0.00 user 0.00 sys
$

在 MacOS X 10.7 上显示的测试。请注意 time 命令的内置版本和外部版本之间的输出格式差异。另请注意,在子 shell 格式中,内置的 time 会正常重定向,但在简单情况下,在内置的 time 之后重定向输出不会将输出发送到与标准错误的其余部分相同的位置。

因此,这些观察可以让您编写优雅的脚本。可能最简单的方法是将现有脚本包装为一个函数,然后通过内置的 time 调用该函数。

原脚本

# This is what was in the Exp script before.
# It echoes its name and its arguments to both stdout and stderr
echo "Exp $*"
echo "Exp $*" 1>&2

修改后的脚本

log=./Exp.log

Exp()
{
# This is what was in the Exp script before.
# It echoes its name and its arguments to both stdout and stderr
echo "Exp $*"
echo "Exp $*" 1>&2
}

(time Exp "$@") 2>> $log

注意谨慎使用"$@"Exp 函数的调用中保留命令行上传递的单独参数,以及同样有意在函数内部使用 $* (这会丢失单独的参数,但仅用于说明目的)。

可能的问题

唯一的问题是原始命令的错误输出也作为计时信息进入同一个日志文件。这可以解决,但涉及 tricky multiple redirections这更有可能造成混淆而不是帮助。但是,郑重声明,这很好用:

log=./Exp.log

Exp()
{
# This is what was in the Exp script before.
# It echoes its name and its arguments to both stdout and stderr
echo "Exp $*"
echo "Exp $*" 1>&2
}

exec 3>&2

(time Exp "$@" 2>&3 ) 2>> $log

关于bash - 什么是 shell 脚本计时 ** 自身 ** (真的)的优雅方式?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7056700/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com