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
是测量峰值内存使用情况。
您可以将别名定义为/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
用于彩色(粗体红色)输出)。