如何简化bash的“eval”$TIME$BIN\u FILE$BIN\u OPTS&>$LOG\u FILE”并使其继续工作?

如何简化bash的“eval”$TIME$BIN\u FILE$BIN\u OPTS&>$LOG\u FILE”并使其继续工作?,bash,shell,eval,Bash,Shell,Eval,我正在更新作为程序测试工具的bash脚本。 之前,我在一个脚本中使用了这行代码,该脚本工作得非常完美$BIN_文件被设置为被测试二进制文件的相对路径: $BIN_FILE $BIN_OPTS &> $LOG_FILE 然后,我决定添加一些性能度量: time $BIN_FILE $BIN_OPTS &> $LOG_FILE" 这也可以很好地工作,但当同时运行许多测试时,脚本的输出中挤满了所有真实的、用户的系统。现在,我将第二个参数传递给脚本,这将导致$TIME变量

我正在更新作为程序测试工具的bash脚本。 之前,我在一个脚本中使用了这行代码,该脚本工作得非常完美$BIN_文件被设置为被测试二进制文件的相对路径:

$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_FILE $BIN_OPTS &> $LOG_FILE
工作?有没有比eval更好看的解决方案

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

在bash中,time是一个保留字。它必须显式写入,因为它是在解析之前解析的,因此是在变量替换之前解析的。例如,不能以这种方式使用内置时间:

cat long-file | time sort
它必须是:

time cat long-file | sort
这里bash将测量整个管道所花费的时间

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

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

如果您希望更具可移植性,那么应该使用它的-p选项在不同的实现下获得相同的输出。见f.e。那么无论您选择什么实现,只要它符合POSIX,它的行为都应该是相同的。

时间在bash中是一个保留字。它必须显式写入,因为它是在解析之前解析的,因此是在变量替换之前解析的。例如,不能以这种方式使用内置时间:

cat long-file | time sort
它必须是:

time cat long-file | sort
这里bash将测量整个管道所花费的时间

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

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


如果您希望更具可移植性,那么应该使用它的-p选项在不同的实现下获得相同的输出。见f.e。然后,无论您选择什么实现,只要它符合POSIX,它的行为都应该是相同的。

您可能会发现使用较短的时间输出格式很有帮助:


任何一个版本的时间输出都可以进一步定制,因此对于Bash内置版本来说,使用更短的时间输出格式可能会有所帮助:


任何一个版本的时间输出都可以进一步定制,Bash builtin的定制就更少了。

谢谢,我现在不知道除了唯一接受的-p选项外,我还可以使用TIMEFORMAT修改Bash builtin显示格式。谢谢,我现在不知道除了唯一接受的-p选项外,我还可以使用TIMEFORMAT修改Bash builtin显示格式。