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

这两条 Bash 行在功能上是等效的。有人能解释一下为什么速度更快吗?
$ 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

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

答案1

time总是乘以紧随其后的管道

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

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

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

$ time { true && sleep 1; }

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

相关内容