ubuntu 16.04中time和/ usr / bin / time之间行为的差异

时间:2016-10-24 21:22:24

标签: bash

我正在自学bash脚本并尝试创建一个完成练习的脚本......

编写一个脚本,用于存储命令(您选择的命令)在三个变量(真实,用户和系统)中运行所需的时间,对应于时间打印的三个默认时间。

我一直在玩类似

的东西
output=$( /usr/bin/time -f "%E\n" ( eval "$@" 2>/dev/null 1>&2) 2>&1 )

计划是使用format标志以某种任意格式获取输出字符串,然后我可以将其拆分为单独的变量。为了额外的信誉,我也试图使用子shell和输出重定向来抑制原始命令的输出。

这当然不起作用。试图运行一个只包含这一行和输入的脚本" ls -l"我收到错误

command substitution: line 14: syntax error near unexpected token `('

经过一番游戏,我注意到了......

time (ls -l)

工作正常,但

/usr/bin/time (ls -l)

给出错误

bash: syntax error near unexpected token `ls'

为什么内置和二进制之间的行为存在差异?

1 个答案:

答案 0 :(得分:2)

不同之处在于time命令与/usr/bin/time不同,是内置在shell中的,因此可以执行外部命令无法执行的操作。

shell看到了

/usr/bin/time (ls -l)

作为带参数的命令/usr/bin/time。命令参数中不允许使用未转义的括号。如果键入,您将收到相同的错误,例如:

/bin/echo (ls -l)

甚至,使用内置命令:

echo (ls -l)

另一方面,内置time旨在更灵活。实际上内置time是关键字,而不是命令;它是shell语法的一部分。

引用bash文档:

  

使用time作为保留字允许shell的时间安排   内置函数,shell函数和管道。外部time命令   不能轻易计时。