我正在尝试将卷曲响应的标头(来自 stderr)存储在变量中,并将正文(来自 stdout)通过管道传输到 grep。
这是我目前的尝试:
{
HEADERS=$(curl -vs $URL 2>&1 1>&3-)
echo "$HEADERS"
} 3>&1 | grep "regex" >> filename
echo "$HEADERS"
当我使用 bash -x script.sh
运行脚本时,我看到+ HEADERS='...'
具有预期的输出,但我无法使用 $HEADERS
访问它们,也无法在内联组内外"$HEADERS"
访问它们。
身体如预期的那样通过管道。
正如 anubhava 正确诊断的那样,问题在于您在子进程中设置HEADERS
,而不是在 shell 的主进程中。
您可以使用 Bash 的进程替换来避免此问题,而无需使用在 shell 中断时必须清理的临时文件:
HEADERS=""
{ HEADERS=$(curl -vs "$URL" 2>&1 1>&3-); } 3> >(grep "regex" > file)
echo "$HEADERS"
grep 子进程被进程替换隐藏。 3>
和>(…)
之间的空间是必要的。
使用了管道而丢失HEADERS
变量,该管道在子外壳中分叉并运行管道命令,并且父外壳看不到在子外壳中创建的变量。
您可以通过临时文件执行此操作:
{ f=$(mktemp /tmp/curl.XXXXXX); curl -vs "$URL" 2>"$f" |
grep 'regex' >> filename; HEADERS="$(<$f)"; trap 'rm -f "$f"' EXIT;}
现在HEADERS
变量将通过读取使用 mktemp
创建的临时文件填充到父 shell 本身中。