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