这两条 Bash 行在功能上是等效的。有人可以解释为什么一个更快吗?

cp1*_*111 28 bash time test

$ time if [[ $dir2 -ot $dir1 ]] ; then open $dir2 ; else open $dir1 ; fi
real    0m0.055s
user    0m0.023s
sys     0m0.018s

$ time  [[ $dir2 -ot $dir1 ]] && open $dir2 || open $dir1
real    0m0.000s
user    0m0.000s
sys     0m0.000s
Run Code Online (Sandbox Code Playgroud)

在上面,我比较了两种测试哪个目录较旧,然后打开较旧目录的方法。我想我只是很困惑为什么测试后的&&and||运算符具有与if/then测试相同的功能,以及为什么它更快。各有优缺点吗?

pLu*_*umo 70

time总是对紧随其后的管道进行计时

管道是一个或多个命令(或简单的序列化合物由控制运算符之一分开)||&

if ... fi是一个单一的复合命令,并且[[ ... ]]是一个命令。后面的部分&&没有被测量,time因为foo && bar是一个命令列表

相比:

$ time if true; then sleep 1; fi

real    0m1.004s
user    0m0.000s
sys     0m0.000s


$ time true && sleep 1

real    0m0.000s
user    0m0.000s
sys     0m0.000s

# example of pipeline separated with |:
$ time true | sleep 1

real    0m1.004s
user    0m0.000s
sys     0m0.000s
Run Code Online (Sandbox Code Playgroud)

要测量所有第二个命令的时间,您可以将它们放在(大括号)中:

$ time { true && sleep 1; }

real    0m1.003s
user    0m0.000s
sys     0m0.000s
Run Code Online (Sandbox Code Playgroud)

  • 准确地说,[Bash 的 `time` 乘以 _pipeline_](https://www.gnu.org/software/bash/manual/bash.html#Pipelines),然后可以包含简单或复合命令。`if-then-fi` 是一个复合命令,它可以是管道的一部分,但是 `foo && bar` 是一个命令列表,不能不分组在 `{ }` 或 `( )` 中。 (11认同)
  • 接得好!`time` 关键字仅适用于它前面的命令(复合或简单)。所以为了在第二个命令中正确计时,他们需要使用 `time open ... || 时间开放......`。 (5认同)
  • @ilkkachu,是的,编辑很好。我所说的“偶然”的意思是,它的实际工作方式不太可能是作者在写它时的想法。 (2认同)