双管道运算符和python virtualenv的奇怪行为

时间:2019-05-03 18:35:24

标签: python bash

我有一个bash构建脚本,该脚本在源代码下运行,因此可以激活Python虚拟环境。我首先使用python3.7 -m unittest运行单元测试。但是,如果这些都失败了,我就不想运行主程序。因此,我需要停用虚拟环境(这样终端才能恢复到其原始状态),然后return 1退出构建脚本。

所以我的脚本看起来像这样

# activate virtual env ...

python3.7 -m unittest || deactivate; return 1;
python3.7 app.py

deactivate

单元测试失败时,python3.7 -m unittest返回1,虚拟环境将按预期停用。

当单元测试成功运行时,python3.7 -m unittest返回0,但是奇怪的是管道的右侧似乎在运行。我还没有弄清楚bash或deactivate是不是很奇怪,但这是一些行为示例:

(exit 0) || deactivate; echo "Tests failed"; return 1; (Output: "Tests failed", deactivate not run)

(exit 0) || echo "Deactivating"; deactivate; echo "Tests failed"; return 1; (Output: "Tests failed", deactivate ran)

(exit 0) || echo "Tests failed"; return 1; (Output: Nothing, deactivate not run)

这三个中的最后一个是有意义的,并且遵循预期的行为,其他两个则没有。

1 个答案:

答案 0 :(得分:5)

这与Bash Pitfall 22有关,但不完全相同。重要的是语句如何分组:

cmd1 || cmd2; cmd3

将运行cmd1,如果退出状态为非零,则cmd2;然后,不管什么cmd3

目的是这样的:

cmd1 || { cmd2; cmd3; }

如果cmd1失败,请运行cmd2cmd3