如何将hub命令产生的多行输出完整存储到Shell变量中
问题原因
hub 命令执行时会将不同类型的内容分别输出到标准输出(stdout,文件描述符1)和标准错误(stderr,文件描述符2),你使用 $() 捕获输出时默认仅捕获 stdout 内容,其余输出到 stderr 的内容会直接打印到终端,不会存入变量。你遇到的场景里只有第二行内容是输出到 stdout 的,所以只捕获到了这一行。
实现方案
第一步:完整捕获所有输出
在命令末尾添加 2>&1 将 stderr 重定向到 stdout,这样所有输出都会被捕获到变量中,不会直接打印给用户:
output=$(hub pull-request -p -b MyOrg:main -h Test_Branch -m "testing" 2>&1)
第二步:匹配错误关键词输出自定义提示
使用 grep 的静默模式(-q)匹配错误关键词,匹配成功后输出自定义报错即可:
if grep -q "Error creating pull request" <<< "$output"; then # 此处可替换为你需要的自定义报错信息 echo "PR 创建失败:当前分支已存在关联的 Pull Request,无需重复创建" exit 1 fi
补充说明
- 上述写法中
<<<是 Bash 的 Here String 语法,用于将变量内容直接传递给 grep 作为输入 - grep 的
-q参数不会输出任何匹配结果,仅通过返回状态码标识是否匹配到内容,适合逻辑判断场景 - 如果使用非Bash的兼容shell,可将判断逻辑替换为
if echo "$output" | grep -q "Error creating pull request"; then,兼容性更好
内容的提问来源于stack exchange,提问作者Eyal Gerber
相关产品推荐
相关产品推荐

