如何始终在 bash 中运行 "clean up" 命令来传播以前的错误代码?



我正在为一个 Node.js 项目设置测试。测试包括与应该从本地http-server提供的静态内容(图像(进行交互。

当测试完成时 - 无论是成功还是失败 - 我想结束服务器进程并使用正确的代码退出。我在 npm 脚本中想出的内容如下:

"server": "http-server testdata -p 9876 -s",
"testcmd": "...",
"test": "npm run server & npm run testcmd && kill $(lsof -t -i:9876) || (kill $(lsof -t -i:9876) && exit 1)",

哪个"有效",但有两个问题:

  • 它重复代码,因为我不知道如何在任何情况下运行事物,而不是定义||&&情况
  • testcmd的任何非零退出代码将始终转换为1退出代码 - 理想情况下,我想传播确切的退出代码

我试着阅读这篇文章,发现人们在谈论陷阱,但无法让它起作用。

简化此控制流方案的好方法是什么?

你的两个问题是相互关联的:如果你的命令被更好地考虑,你会更容易实现你所追求的目标。

由于您不想设置陷阱(对于此任务,我不怪您(,因此您需要做的是捕获testcmd的退出状态,以便稍后可以重申它。 完成此操作后,您可以无条件地运行清理,因此不会重复。 例如:

npm run server & (npm run testcmd; status=$?; kill $(lsof -t -i:9876); exit $status)

也许特殊$?参数(可扩展到最近执行的 [部分] 管道的退出状态(是您缺少的部分。

相关内容

最新更新