2

我正在Bash专门使用,但我想大多数 shell 的行为方式都是一样的。

我经常做

hg pull && hg update --clean

但是我突然想到,如果成功hg pull返回0,为什么要执行hg up命令?

通常,&&运算符的工作方式是,如果前一个参数为真,它只会执行下一个参数。0在 Bash 中是真的,还是什么?

这是因为我尝试在 Python 中做同样的事情,但我不得不这样写:

call(['hg','pull']) or call(['hg','update','--clean'])
4

2 回答 2

3

作为帮助,您可以记住命令正确结束时(没有错误)意味着true。他的退出代码为零

所以,

  • 正确= OK = true = 退出状态 0
  • 不正确 = BAD = false = 退出状态 > 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 失败时,comman2 将不会执行(失败),因此 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)

The last construction is neat, because you can write

command1 && (commands if the command1 is successful) || (commands if not)
于 2013-05-03T17:37:29.437 回答
2

'&&' 运算符在 Bash 中以两种方式运行。

一方面,它是您所期望的条件运算符:

if [ $condition1 ] && [ $condition2 ]
#  Same as:  if [ $condition1 -a $condition2 ]
#  Returns true if both condition1 and condition2 hold true...

if [[ $condition1 && $condition2 ]]    # Also works.
#  Note that && operator not permitted inside brackets
#+ of [ ... ] construct.

另一方面,它可用于连接命令,在这种情况下,它会显式检查命令的返回码,并在值为 0 时沿链向下执行 。请参阅文档

于 2013-05-03T17:32:38.697 回答