如何在变量和管道标准输出中捕获stderr

时间:2016-04-21 09:38:55

标签: bash shell curl stderr

我正在尝试将卷曲响应的标题(来自stderr)存储在变量中,并将正文(从stdout)传递给grep。

这是我目前的尝试:

org.springframework.beans.factory.parsing.BeanDefinitionParsingException: Configuration problem: the 'initial-delay' attribute may not be used with cron and trigger tasks

当我使用{ HEADERS=$(curl -vs $URL 2>&1 1>&3-) echo "$HEADERS" } 3>&1 | grep "regex" >> filename echo "$HEADERS" 运行脚本时,我看到bash -x script.sh带有预期的输出,但我无法使用+ HEADERS='...'$HEADERS内部和外部访问它们内联组。

按照预期,身体得到了通过。

2 个答案:

答案 0 :(得分:2)

由于使用了在子shell中分叉和运行管道命令的管道而丢失了HEADERS变量,并且父shell没有看到在子shell中创建的变量。

您可以通过临时文件执行此操作:

{ f=$(mktemp /tmp/curl.XXXXXX); curl -vs "$URL" 2>"$f" |
grep 'regex' >> filename; HEADERS="$(<$f)"; trap 'rm -f "$f"' EXIT;}

现在HEADERS变量将通过读取使用mktemp创建的临时文件填充在父shell中。

答案 1 :(得分:2)

正确地anubhava diagnosed,问题在于您在子流程中设置HEADERS,而不是在shell的主流程中设置。{/ p>

您可以使用Bash的process substitution来避免此问题,而不使用在shell被中断时必须清理的临时文件:

HEADERS=""
{ HEADERS=$(curl -vs "$URL" 2>&1 1>&3-); } 3> >(grep "regex" > file)
echo "$HEADERS"

进程替换隐藏了grep子进程。 3>>(…)之间的空格是必要的。