我有一个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)
这三个中的最后一个是有意义的,并且遵循预期的行为,其他两个则没有。
答案 0 :(得分:5)
这与Bash Pitfall 22有关,但不完全相同。重要的是语句如何分组:
cmd1 || cmd2; cmd3
将运行cmd1
,如果退出状态为非零,则cmd2
;然后,不管什么,cmd3
。
目的是这样的:
cmd1 || { cmd2; cmd3; }
如果cmd1
失败,请运行cmd2
和cmd3
。