Bash变量扩展不能与time命令结合使用

时间:2015-05-28 20:38:15

标签: linux bash shell time

我在bash中编写了一个小shell脚本,用time命令测量几个可执行文件的速度。因为我想计算几个不同的程序,为了避免重复我自己,我保存了time命令和我想要的格式字符串,并尝试使用变量扩展(以ls的性能测试为例):

#!/usr/bin/env bash

timer="/usr/bin/time -f 'elapsed time: %E' --"
$timer ls 1>/dev/null

time命令应该使用--将其选项(在本例中为格式字符串)与它应该使用的命令分开。但是,在此脚本中time坚持尝试执行我的格式字符串并使用

失败
/usr/bin/time cannot run time:: No such file or directory
Command exited with non-zero status 127
'elapsed

但是如果我将整个命令放在没有变量扩展的一行上,它就会正确识别格式字符串并执行ls

#!/usr/bin/env bash

/usr/bin/time -f 'elapsed time: %E' -- ls 1>/dev/null

产生"经过时间:0:00.00"

我最后只是在每一行输入整个命令以使其运行,但我很好奇是否有人能解释为什么变量扩展在这里不起作用。

2 个答案:

答案 0 :(得分:2)

$timer中的数据在$IFS(空格)上分开,并用作单独的参数。它没有扩展,然后作为bash代码进行评估。

您的命令$timer ls因此等同于:

"/usr/bin/time" "-f" "'elapsed time:" "%E'" "--" "ls"

在您的情况下执行此操作的正确方法是使用函数:

timer() {
  /usr/bin/time -f 'elapsed time: %E' -- "$@"
}
timer ls

PS:shellcheck会自动指出此问题。

答案 1 :(得分:1)

您需要使用BASH数组来存储命令行:

timer=(/usr/bin/time -f 'elapsed time: %E' --)
"${timer[@]}" ls