bash脚本中无法捕获peer chaincode invoke命令输出存入变量
捕获peer chaincode invoke输出并提取项目ID的解决方案
核心问题原因
peer chaincode invoke 命令的运行日志、执行返回结果默认会输出到标准错误流(stderr),仅捕获标准输出(stdout)会得到空值。
具体实现步骤
- 第一步:合并标准错误流到标准输出,完整捕获命令输出存入变量
执行命令时添加2>&1将stderr合并到stdout,再赋值给变量:# 替换成你实际的invoke参数,记得加--waitForEvent确保拿到执行完成的结果 invoke_result=$(peer chaincode invoke -o orderer.example.com:7050 -C mychannel -n mycc --waitForEvent -c '{"Args":["MintProject",...]}' 2>&1) - 第二步:根据输出格式提取项目ID
场景1:输出有固定的ID前缀标识
比如输出中存在Minted project ID: proj_123456这类固定格式的行,可直接用grep提取:# 把Minted project ID: 替换成你实际输出里的ID前缀 project_id=$(echo "$invoke_result" | grep -oP 'Minted project ID: \K.*')场景2:返回结果包含JSON格式的payload
先提取JSON串再用jq解析对应字段即可,比如返回内容包含result: {"payload":{"project_id":"proj_789"}}:# 先提取JSON部分再用jq取字段,替换成你实际的JSON路径 project_id=$(echo "$invoke_result" | grep -oP 'result: \K.*' | jq -r '.payload.project_id')
注意事项
- 必须给invoke命令添加
--waitForEvent参数,等待交易提交确认并返回链码执行结果,否则只会拿到交易提交成功的回执,不会包含铸造生成的项目ID - 执行脚本的环境需提前配置好peer命令运行所需的环境变量(MSP路径、节点地址、TLS证书路径等),否则命令执行报错也会导致无法拿到预期输出
内容的提问来源于stack exchange,提问作者hejte
相关产品推荐
相关产品推荐

