【问题标题】:Bash variable expansion can't be combined with time commandbash 变量扩展不能与 time 命令结合使用
【发布时间】:2015-05-28 20:38:15
【问题描述】:

我正在用 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”

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

【问题讨论】:

    标签: linux bash shell time


    【解决方案1】:

    $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自动指出的。

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

        猜你喜欢
        • 2014-01-28
        • 2013-09-29
        • 1970-01-01
        • 2015-04-28
        • 2015-12-13
        • 1970-01-01
        • 2018-08-22
        • 2016-07-20
        • 1970-01-01
        相关资源
        最近更新 更多