我正在尝试编写的 shellscript 是
- 下载一个 tarball 和 stdout
tar
来解压它 - 同时解析在stderr找到的http头
- 将#2 处的解析结果设置为变量。
对于#1:
$ wget -Sq -O- "https://api.github.com/repos/est/est/tarball/master" | tar -zmxf -
我启用了-S
显示服务器对 stderr 的响应的选项,我想稍微解析一下字符串 commit hash 的标头,并将其设置为一个名为$rev
$ rev=$(wget -Sq -O /dev/null "https://api.github.com/repos/est/est/tarball/master" 2>&1 | grep "Content-Disposition:" | tail -1 | awk 'match($0, /filename=.+\-([a-zA-Z0-9]+)\./, f){ print f[1] }')
$ echo $rev
dacd56e
所以基本上,我想要一个可以
- 管道标准输出到一个命令,也管道标准错误到另一个命令
- 解析标准错误并将输出设置为变量
- 不要创建临时文件
对于#1 https://stackoverflow.com/a/9217228/41948
对于#2,我发现答案是read
命令,但不幸的是,该变量只能在子 shell 中找到。
那么如何将在read
命令子shell 中找到的变量传递给父shell?
或者我该如何编写这样的shellscript?