如何将 STDERR 捕获到 bash 变量而不影响 STDOUT?

How can I capture STDERR into bash variable and not affect STDOUT?

我正在尝试从 pg_dump 中捕获错误,但无法弄清楚如何将其放入 bash 变量中。这不起作用,因为 STDOUT 将进行 gzip。

OUTPUT=$(/bin/pg_dump -c --if-exists --dbname=cfMaster -U cfMaster | /bin/gzip > ~cftvdun/dbbackups/cfMaster.tmp.sql.gz)

在这种情况下如何将 STDERR 放入 bash 变量中?

$( ) 构造始终捕获标准输出,但您可以在文件描述符之间切换。只需将管道分组在 { } 中,然后使用 2>&1:

将组的标准错误重定向到标准输出
output=$( { /bin/pg_dump -c --if-exists --dbname=cfMaster -U cfMaster | /bin/gzip > ~cftvdun/dbbackups/cfMaster.tmp.sql.gz; } 2>&1 )

如果您还需要标准输出(而不是仅仅将其发送到文件),它会变得更加复杂。我认为在那种情况下,您必须兼顾 FD #3。

顺便说一句,我还建议使用小写(或混合大小写)变量名,以避免与对 shell 或其他实用程序具有特殊含义的变量发生意外冲突。