在调用 /usr/bin/time 之前扩展别名

在调用 /usr/bin/time 之前扩展别名

当我使用 shell 内置命令时time,我可以传递任何我想传递给 shell 的命令,而无需使用time.但是当我使用 external 时/usr/bin/time,我无法传递 shell 别名,因为/usr/bin/time它自然不知道这些:

$ /usr/bin/time ll
/usr/bin/time: cannot run ll: No such file or directory

如何说服 shell 在ll将别名传递给 之前扩展别名/usr/bin/time?解析 的输出alias ll很棘手,特别是因为别名的定义包含其他别名。


我使用的原因/usr/bin/time是为了测量内存使用峰值

答案1

您可以将别名定义为/usr/bin/time

alias 'ubtime=/usr/bin/time '

或者

alias 'ubtime=command time '

如果您不想对time可执行文件的路径进行硬编码。

诀窍在于别名定义中的尾部空格,它告诉 shell 必须在该别名之后替换别名,以便

ubtime ll

实际上将扩展为

/usr/bin/time ls -l

(假设ll是 的别名ls -l)。

无论如何,/usr/bin/time作为一个独立的可执行文件,它无法对管道或复合命令或函数或 shell 内置函数进行计时,因此它无法对任意别名的扩展进行计时。

如果使用的原因/usr/bin/time是因为您更喜欢其默认输出格式而不是time按键输出格式,请注意,在许多 shell 中,可以修改该格式。例如,在zsh

$ TIMEFMT=$'\e[31;1m%J\e[m: U:%U S:%S (%*E total) [avgtext:%X avgdata:%D maxmem:%M]'
$ time ls -l | head -n1
total 288072444
ls -l: U:0.00s S:0.01s (0.017 total) [avgtext:0 avgdata:0 maxmem:3]
head -n1: U:0.00s S:0.00s (0.015 total) [avgtext:0 avgdata:0 maxmem:3]

\e[31;1m用于彩色(粗体红色)输出)。

答案2

这可能在 bash 中有效:

/usr/bin/time  $(alias "ll" | sed "s/^alias [^=]*='\(.*\)'/\1/")

但对于任意别名,如空格、转义字符、嵌套别名和函数等,还不是完全安全的。

我想不可能有不丑陋的解决方案。这就是为什么 shell 有一个内置的time.即使别名扩展会更容易,下一个问题将是如何对函数进行计时。请注意,别名甚至可以使用 shell 函数。

如果你的别名是在 bash 的配置文件中定义的,并且你不关心时间开销,你可以尝试

/usr/bin/time bash -l -i -c "ll"

相关内容