我正在尝试将卷曲响应的标题(来自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
内部和外部访问它们内联组。
按照预期,身体得到了通过。
答案 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>
和>(…)
之间的空格是必要的。