代码之家  ›  专栏  ›  技术社区  ›  chronos

如何简化bash的eval“$time$bin_file$bin_opts&>$log_file”,并使其保持工作状态?

  •  1
  • chronos  · 技术社区  · 16 年前

    我正在更新作为程序测试工具的bash脚本。 以前,我在一个脚本中有一行很好地工作( $BIN_FILE 设置为要测试的二进制文件的相对路径):

    $BIN_FILE $BIN_OPTS &> $LOG_FILE
    

    然后我决定添加一些“性能度量”:

    time $BIN_FILE $BIN_OPTS &> $LOG_FILE"
    

    这也很好地工作,但是当一次运行许多测试时,脚本的输出被那些“真实的、用户的、系统的”太拥挤了。现在,我将向脚本传递第二个参数,这将导致$time变量被赋值为'time'。然而,

    $TIME $BIN_FILE $BIN_OPTS &> $LOG_FILE
    

    只是不起作用。唯一可行的选择似乎是

    eval "$TIME $BIN_FILE $BIN_OPTS &> $LOG_FILE"
    

    但是很难看。

    为什么不

    $time$bin_文件$bin_选项&$log_文件
    

    工作?有没有更好的解决方案,然后是 埃瓦 ?

    另外,关于可移植性——我应该使用bash的内部“时间”,还是调用gnu/usr/bin/time?

    2 回复  |  直到 16 年前
        1
  •  3
  •   liori    16 年前

    time 是bash中的保留字。必须显式写入,因为在分析“”之前对其进行了分析。 simple commands “,因此在变量替换之前。例如,不能使用内置 时间 这样:

    cat long-file | time sort
    

    必须这样:

    time cat long-file | sort
    

    这里 bash 将通过整个管道测量花费的时间。

    GNU time 是一个简单的二进制文件,所以它可以按照你的意思使用…可用于管道中间。但它并不总是安装的,所以我想您最好使用内置的。

    我想你想省略一下 时间 在某些特定的情况下,因此需要变量替换。如果是这样,你可以 GNU时间 , eval 或者某种 if..fi 结构,但您绝对不能使用您想要的内置方式。

    如果你想更便携,你应该使用它 -p 在不同的实现下获得相同输出的选项。参见F.E. OpenGroup's time description . 然后,无论您选择什么实现,它的行为都应该相同(只要它符合POSIX)。

        2
  •  1
  •   Dennis Williamson    16 年前

    您可能会发现使用较短的格式输出 time 以下内容:

    $ /usr/bin/time -f "Real %E" sleep 1
    Real 0:01.02
    $ TIMEFORMAT="Real %R"
    $ time sleep 1        # Bash builtin
    Real 1.027
    

    任何版本的输出 时间 可以进一步定制(对于bash builtin来说就更少了)。

    推荐文章