捕获BASH脚本中curl的错误信息并检查状态

s4n0splo  于 2022-11-13  发布在  其他
关注(0)|答案(2)|浏览(270)

在BASH脚本中,我需要curl中的4项内容:

  • 我需要将brief人类可读的错误消息从curl捕获到bash变量中。
  • 我需要能够检查命令是否成功完成。
  • 我需要命令来运行
  • 我不希望任何东西打印到控制台,除非我回显它。
m=$(curl -u "$user":AP"$pass" -T "$pathA" "$url")
if [ $? -ne 0 ] ; then
   echo "Error: ""$m"
fi

问题是curl把乱码放到了$m中。它只是把错误转储到控制台而不是m。我不想把任何东西打印到控制台,除非我回显它。而且我只想捕获错误描述。我尝试了很多变体,似乎没有什么适合这个用例...至少在Stack上没有任何建议。

xuo3flqw

xuo3flqw1#

curl将错误发送到STDERR,并且不会$m捕获。curl的输出被发送到STDERR(您提到的乱码)。
一种解决方案是通过在脚本中的curl调用中添加2>&1,将STDERR重定向到STDOUT:

m=$(curl -u "$user":AP"$pass" -T "$pathA" "$url" 2>&1)
if [ $? -ne 0 ] ; then
   echo "Error: ""$m"
fi

如果您只关心错误,也可以使用curl--fail--silent--show-errors标志,如以下示例所示:
Making curl send errors to stderr and everything else to stdout
以及有关在bash脚本中将STDERR捕获到$variable的一些信息:
Bash how do you capture stderr to a variable?

neekobn8

neekobn82#

类似于一个建议;我只是使用输出stderror,因为$?始终为0。

OUTPUT=$(curl -X POST -H 'Content-type: application/json' --data "{\"text\":\"$MSG \"}" $SLACK_URL 2>1)
echo $OUTPUT
if [[ $OUTPUT == "ok" ]]; then
  echo "$FILE_NAME Msg successfully sent"
elif [[ $OUTPUT == "invalid_token" ]]; then
  echo "$FILE_NAME Slack url incorrect"
else
  echo "$FILE_NAME Some issue Sending msg"
fi

相关问题