如何在Bash中回显存为变量的curl命令后执行并保存输出到变量
问题根因
- 直接执行
eval $CMD时输出直接打印到标准输出流,没有被捕获到变量中 - 把带转义引号的复杂命令存到字符串变量时,直接用
$($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
相关产品推荐
相关产品推荐

