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



我正在尝试将卷曲响应的标头(来自 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 本身中。

相关内容

  • 没有找到相关文章

最新更新