我正在自学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'
为什么内置和二进制之间的行为存在差异?
答案 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
命令 不能轻易计时。