如何从花括号作用域返回变量?以获取curl命令返回码为例
解决Bash中花括号管道作用域内变量无法外部访问的问题
你的脚本里拿不到rc变量的核心原因是:管道(|)会创建子shell进程,花括号里的代码是在子shell中执行的,子shell里的变量无法传递回父shell,所以外部的echo读不到rc的值。
下面给你几种可行的解决方法:
方法1:用进程替换替代管道(推荐)
进程替换(>(...))不会创建子shell,花括号内的代码在当前shell环境执行,变量可以直接保留:
#!/usr/bin/bash { # scope for tee curl --max-time 5 "https://google.com" rc=$? } > >(tee "page.html") echo "return code: $rc"
这里> >(tee "page.html")相当于把花括号的输出重定向到tee进程,整个过程没有创建子shell,rc变量会留在当前shell里。
方法2:用临时文件传递返回码
如果你的环境不支持进程替换(比如某些老旧Bash版本),可以把返回码写入临时文件,再从父shell读取:
#!/usr/bin/bash # 创建临时文件 tmp_rc=$(mktemp) { # scope for tee curl --max-time 5 "https://google.com" # 把返回码写入临时文件 echo $? > "$tmp_rc" } | tee "page.html" # 从临时文件读取返回码 rc=$(cat "$tmp_rc") # 清理临时文件 rm "$tmp_rc" echo "return code: $rc"
方法3:利用pipefail选项直接获取管道返回码
如果你只需要curl的返回码,且能接受tee失败时返回tee的错误码,可以开启pipefail选项:
#!/usr/bin/bash # 开启pipefail:管道的退出状态为最后一个非零命令的退出码 set -o pipefail curl --max-time 5 "https://google.com" | tee "page.html" # 此时$?就是curl的返回码(如果curl失败),或者tee的返回码(如果tee失败) rc=$? echo "return code: $rc"
内容的提问来源于stack exchange,提问作者crackpot
相关产品推荐
相关产品推荐

