我特别使用了Bash,但我想大多数shell的行为都是一样的。
我经常这样

hg pull && hg update --clean

但我刚刚想到,如果成功时hg pull返回0,为什么要执行hg up命令?
通常,&&运算符的工作方式是,如果前一个参数是真的,它将只执行下一个参数。是真的吗?还是怎么了?
之所以出现这种情况,是因为我尝试用Python编写类似的代码,但我必须这样编写:
call(['hg','pull']) or call(['hg','update','--clean'])

最佳答案

作为帮助,当正确结束(没有错误)表示真时,您可以记住than命令。他的退出代码是零
所以,
正确= OK=true=退出状态0
不正确=坏=假=退出状态> 0
因此,例如,递归删除所有文件的正确方法是

$ pwd
/
$ cd /tnp && rm -rf *
cd: can't change directory  #and the rm WILL NOT executed

而不是
$ pwd
/
$ cd /tnp ; rm -rf *
cd: can't change directory  #but the rm IS executed (in the root directory)

补充:
command1 && command2 && command3
               ^            ^
               |            +-- run, only when command2 exited OK (zero)
               |
               +--run only when command1 exited OK (zero)

因此,如果command1或command2失败,command3将不会执行。(当comman1失败时,command2将不会执行(失败),因此command3也不会执行。
玩下一个
run() {
    echo "comand-$2($1)"
    return $1
}

ok() {
    run 0 $1
}
fail() {
    run 1 $1
}

echo "OK && OK && ANY"
ok A && ok B 0 && ok C
echo

echo "OK && FAIL && ANY"
ok A 0 && fail B 1 && ok C
echo

echo "FAIL && ANY && ANY"
fail A && ok B && ok C
echo

echo "OK || ANY || ANY"
ok A || ok B || ok C
echo

echo "FAIL || OK || ANY"
fail A || ok B || ok C
echo

echo "FAIL || FAIL || OK"
fail A || fail B || ok C
echo

echo "FAIL && OK || OK"
fail A && ok B || ok C
echo

结果
OK && OK && ANY
comand-A(0)
comand-B(0)
comand-C(0)

OK && FAIL && ANY
comand-A(0)
comand-B(1)

FAIL && ANY && ANY
comand-A(1)

OK || ANY || ANY
comand-A(0)

FAIL || OK || ANY
comand-A(1)
comand-B(0)

FAIL || FAIL || OK
comand-A(1)
comand-B(1)
comand-C(0)

FAIL && OK || OK
comand-A(1)
comand-C(0)

最后一个结构很整洁,因为你可以写
command1 && (commands if the command1 is successful) || (commands if not)

10-01 13:32