linux - Bash变量扩展不能与时间命令结合使用

标签 linux bash shell time

我在 bash 中编写了一个小的 shell 脚本,以使用 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”

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

最佳答案

$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自动指出这个问题.

关于linux - Bash变量扩展不能与时间命令结合使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30516647/

相关文章:

linux显示你在2050年生日是星期几

regex - 如何搜索 () { :; }; bash vulnerability pattern in many files?

linux - 如何确定 Centos 7 中正在运行的服务的名称

linux - 合并头文件和部分尾文件然后合并到标准输出的有效方法

用于删除旧文件的 Shell 命令

python - 使用 KeyboardInterrupt 异常捕获 SIGINT 在终端中有效,而不是在脚本中有效

c - UDP - 多服务器单客户端

python - 运行多个python的linux bash脚本

linux - Makefile PHONY 在大文件中的使用

linux - bash shell : Cannot use variable $ as a path to run tar