Bash命令链在预期时不会终止

时间:2016-12-03 16:57:47

标签: bash shell

在处理项目工具链时,显然我不理解bash列表。

从手册:
“manual”:man bash

  

列表:

     

列表是由一个或多个管道分隔的一个或多个管道的序列   运营商;,&,&&,或||,

     

[...]

     

在这些列表运营商中,&&和||具有相同的优先权,其次是;   和&,具有相同的优先权。

     

[...]

     

AND和OR列表是由一个或多个管道分隔的序列   和&&和||分别控制运营商。 AND和OR列表是   以左关联性执行。 AND列表的格式为

     

command1&&命令2

     当且仅当command1返回退出状态时,才执行

command2   为零。

     

OR列表的格式为

     

command1 ||命令2

     当且仅当command1返回非零退出时才执行

command2   状态。 AND和OR列表的返回状态是退出状态   列表中执行的最后一个命令    [格式化我的]

而不是看起来像这样的代码:

command1

if [ $? -eq 0 ];
then
    command2
fi;

我们可以这样做:

command1 && command2

在我的一个脚本中,我的代码功能与此相同:

#!/bin/bash

s () { return 0; }
f () { return 1; }
l () { echo "Y"; }

#Why does this output "Y"?
f && f || true && s && l

#This does what I want:
f && { f; s && l; }

在上面的例子中,我希望(并且非常想要)f || true && s && l仅在f没有失败时运行。但是,我必须使用f && { f; s && l; }来获得我想要的功能。

我误解了什么?为什么链条“继续”超过第一个&&

命令链不应该在f &&之后停止运行,因为当且仅当command1返回非零退出状态时“执行command2”?

PS:我希望它的功能如下。

if (f == 0) {
    if (f != 0) {
        if (0 == 0) {
            if (s == 0) {
                l;
                }
            }
        }
     }

1 个答案:

答案 0 :(得分:1)

  

为什么输出“Y”?

f && f || true && s && l
is the same as
( 
  (
    ( 
      (
        f && f
      ) || true 
    ) && s 
  ) && l
)

但是s = false

( 
  (
    f && f
  ) || true 
) && s
-> false

实际上

f && f || true && s && l -> l
  

关于PS

not (f=0) || not (f!=0) || not (0=0) || not (s=0) ||  l