【问题标题】:Force sh to fail if the command substituting its command string fails如果替换其命令字符串的命令失败,则强制 sh 失败
【发布时间】:2020-10-07 08:47:48
【问题描述】:

我想从 URL 执行 bash 脚本。
我使用sh -c "$(curl -f ${SCRIPT_URL})"
它可以工作,但如果 url 不正确或子脚本出错,则父脚本成功完成。

例子:

set -e
sh -c "$(curl -f ${SCRIPT_URL})"
echo "success"

使用附加变量可能会出现需要错误:

set -e
url=$(curl -f ${SCRIPT_URL})    
sh -c "$url"
echo "success"

但我不想使用额外的变量。是否可以在没有额外变量的情况下做到这一点?

【问题讨论】:

  • 如果脚本失败,第一个应该按照你想要的方式工作。第二个在第三行出现错误。它的使用方式看起来应该是sh -c "$url"。看起来如果 curl 失败,它可能会返回一个很好的返回码。请参阅this 答案。
  • 理想情况下,您会在 sh 运行之前失败。最好在执行sh 之前验证curl 的完整输出是您期望的脚本。将脚本保存到文件,验证它,然后只需运行sh theScript.sh

标签: bash curl sh


【解决方案1】:

如果curl失败写exit 1,这样sh会以状态1退出,set -e会生效。

set -e
sh -c "$(curl -f "${SCRIPT_URL}" || echo exit 1)"
echo success

使用变量或中间文件,不依赖set -e 处理错误确实是更好的方法。

【讨论】:

  • 不错的答案。我一般尽量避免set -e。对于这样的事情,我更愿意使用if sh -c ... 检查返回码,或者只是将其设为单行。 sh -c "$(curl -f "${SCRIPT_URL}" || echo exit 1)" && echo succeed
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-02-16
  • 2018-04-18
  • 2019-04-22
  • 2016-05-17
相关资源
最近更新 更多