![在调用 /usr/bin/time 之前扩展别名](https://linux22.com/image/95282/%E5%9C%A8%E8%B0%83%E7%94%A8%20%2Fusr%2Fbin%2Ftime%20%E4%B9%8B%E5%89%8D%E6%89%A9%E5%B1%95%E5%88%AB%E5%90%8D.png)
当我使用 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"