You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Bash中回显存为变量的curl命令后执行并保存输出到变量

问题根因

  1. 直接执行eval $CMD时输出直接打印到标准输出流,没有被捕获到变量中
  2. 把带转义引号的复杂命令存到字符串变量时,直接用$($CMD)执行会出现参数解析错误,无法正确执行命令

最小改动兼容方案

不需要修改你现有存储命令的逻辑,只需要调整捕获输出的写法,把eval整个放入命令替换块中即可,如需同时捕获curl的警告/错误信息,可添加2>&1将标准错误合并到标准输出:

# 回显命令
echo $CMD
# 执行命令并捕获完整输出到变量
OUT=$(eval "$CMD" 2>&1)

更安全的最佳实践方案

不推荐把命令存储在字符串变量中,很容易出现引号转义、参数解析错误问题,建议改用Bash数组存储命令参数,无需依赖eval,执行更稳定:

# ----- step 1 -----
URL="https://web.example.com:8444/hello.html"
# 用数组存储curl命令参数
CMD_ARGS=(
  curl
  --insecure
  --dump-header -
  "$URL"
)

# 回显命令
echo "${CMD_ARGS[*]}"
# 执行命令并捕获输出
OUT=$("${CMD_ARGS[@]}" 2>&1)

# 提取JSESSIONID(简化写法,无需复杂awk处理)
JSESSIONID=$(echo "$OUT" | grep -oP 'Set-Cookie: JSESSIONID=\K[^;]+')
# 提取跳转地址
URL=$(echo "$OUT" | grep -oP 'Location: \K\S+')

# ----- step 2 -----
CMD_ARGS=(
  curl
  --insecure
  --dump-header -
  --cookie "JSESSIONID=$JSESSIONID"
  "$URL"
)
echo "${CMD_ARGS[*]}"
OUT=$("${CMD_ARGS[@]}" 2>&1)

额外注意事项

  • 引用$OUT变量时要包裹双引号,比如echo "$OUT",避免输出内容中的换行符被空格替代导致解析失败
  • 如果不需要捕获curl的错误/警告输出,移除2>&1即可仅捕获接口返回的标准输出内容

内容的提问来源于stack exchange,提问作者zappee

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.03 00:39:03