我特意使用Bash
,但我想大多数shell的行为都是一样的。
我经常做
hg pull && hg update --clean
但是我刚刚想到,如果hg pull
成功返回0
,为什么它会执行hg up
命令?
通常&&
运算符的工作方式是,如果前一个参数是真实的,它只会执行下一个参数。 Bash中0
是真的,还是什么?
这是因为我尝试在Python中使用等效的,但我必须这样写:
call(['hg','pull']) or call(['hg','update','--clean'])
答案 0 :(得分:3)
作为帮助,当结束 (没有错误)意味着 true 时,您可以记住命令。他的退出代码零
所以,
因此,例如,递归删除所有文件的正确方法是
$ 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)
答案 1 :(得分:2)
'&&'运算符在Bash中以两种方式运行。
一方面,它是你所期望的conditional operator:
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时向下进行链接。See the doc。