所以我有一个像以下
的bash脚本for test in Test*.py; do
python $test && python3 $test || echo "Test $test failed" && exit 1
done
echo "All tests pass!"
似乎即使测试成功exit 1
也会被调用。
我认为&&
的优先级高于||
(快速Google搜索的结果here)?
为了测试这个我试过
for test in Test*.py; do
python $test && python3 $test || { echo "Test $test failed" && exit 1 }
done
echo "All tests pass!"
但后来我得到了
./ test:第4行:意外令牌
done' ./test: line 4:
附近的语法错误'
最终我得到了我期望的
for t in Test*.py; do
python $t && python3 $t || eval 'echo "Test for $t failed" && exit 1'
done
echo "All tests pass!"
但这看起来不那么优雅,因为我必须在引用的字符串中加上一半的行。
我的问题是,为什么上面的前两个片段不起作用?运算符优先级规则不能像我预期的那样工作吗?此外,如果{
和}
不起作用,是否有办法在不调用子shell的情况下对命令进行分组?
答案 0 :(得分:4)
要解释最初的问题,“[t]he exit status is carried through from whichever command was most recently executed, and skipping a command doesn't change it.”或者,跳过的命令没有返回代码。因此,在1 && 2 || 3 && 4
之类的语句中,4
将会如果3
成功,则1 && 2
成功运行,如果3
成功,则成功。(因此会跳过&&
)。
此外,您需要在grouping中的每个命令中添加终结符(||
,;
或python $test && python3 $test || { echo "Test $test failed" && exit 1; }
) ,就像这样:
class Worker implements Callable<String> {
private int id;
public Worker(int id) {
this.id = id;
System.out.println("im worker = " + id);
}
public String call() throws Exception {
System.out.println("Started some long operation - " + id);
Thread.sleep(1000); // only to simulate long running operation
System.out.println("Fiished long operation - " + id);
return null;
}