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

ger*_*rit 5 shell alias time-utility

当我使用内置的 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
Run Code Online (Sandbox Code Playgroud)

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


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

Sté*_*las 3

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

alias 'ubtime=/usr/bin/time '
Run Code Online (Sandbox Code Playgroud)

或者

alias 'ubtime=command time '
Run Code Online (Sandbox Code Playgroud)

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

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

ubtime ll
Run Code Online (Sandbox Code Playgroud)

实际上将扩展为

/usr/bin/time ls -l
Run Code Online (Sandbox Code Playgroud)

(假设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]
Run Code Online (Sandbox Code Playgroud)

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