在 bash 脚本中捕获来自作曲家验证的 return 代码

Catch return code from composer validate in bash script

我正在尝试编写一个 bash 脚本,在尝试 运行 composer install 之前验证 composer.lock 与 composer.json 是最新的。

我试过这样的事情:

if composer validate --no-check-all
  then echo "Composer validation failed..."
  exit 1;
fi

# composer install

这确实会在验证错误时退出我的脚本,但是当验证通过时,我仍然会得到以下输出:

./composer.json is valid
Composer validation failed...

我做错了什么?

编辑:正如 Jeff Schaller 正确指出的那样,if 块中的测试语句缺少否定。它对问题的影响不大(因为 composer validate 的退出代码是相同的)。我保留原来的措辞,以免引起更多混淆。

我唯一注意到的是你 if 背后的意图似乎是倒退的。如果验证失败,您的意图是退出脚本,由 return code from composer, which is documented as:

指示
  • 0:好的
  • 1: Generic/unknown 错误代码
  • 2:依赖解决错误码

if conditional construct 接受 test-commands 和...

的列表

if its return status is zero, the consequent-commands list is executed

所以你可能 打算 是 invert/negate 那 return 代码,这样你就可以在你从 non-zero 获得状态时退出作曲家:

if ! composer validate --no-check-all
  then echo "Composer validation failed..."
  exit 1;
fi

# composer install

在您的情况下,composer validate ... 似乎是 returning 0,无论它是否遇到错误。也许您正受到 this bug report related to brew?

的影响

您过于相信作曲家退出代码的可靠性。
命令

composer validate --no-check-all

返回零,这是正确的,因为该命令在执行过程中没有实际问题。考虑捕获变量中的输出并读取它。

#!/bin/bash

OUTPUT=$(composer validate --no-check-all)

if [[ "$OUTPUT" == *"is valid"* ]]; then
  echo "composer.json is valid (or whatever you want to do here)"
fi