python $ test || echo" Test $ test failed" &安培;&安培;退出1不按预期工作

时间:2015-08-05 06:40:26

标签: bash

所以我有一个像以下

的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的情况下对命令进行分组?

1 个答案:

答案 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;
}