在 Fish shell 中将 stdout 和 stderr 捕获为单独的变量

在 Fish shell 中将 stdout 和 stderr 捕获为单独的变量

这可能吗?

我想运行一个命令,但将其 stdout 和 stderr 捕获为单独的变量。目前我正在使用set -l var (cmd),这使 stderr 保持不变。我可以set -l var (cmd ^&1)将 stdout 和 stderr 合并到 var 中,但随后我无法轻松地将它们再次分开。

有没有办法让 var 和 var_err 保存来自 cmd 的 stdout 和 stderr ?

答案1

begin; cmd ^|read -z err; end |read -z out

鱼壳/鱼壳 #2463,

Fish 示例中的一个问题是它重定向 [cmd] 和 [read] 的 [stdout],因此如果后者打印任何内容,它将通过管道进行传输。

但我认为在正常情况下 read 不应该打印任何内容(尤其是打印到标准输出),所以这应该没问题。

编辑:如果需要确切的语义set var (cmd),可以使用set var (printf '%s' $out)和来实现set var_err (printf '%s' $err)

答案2

最简单的方法是将其中一个流重定向到文件:

set tmpf (mktemp)
trap "rm $tmpf" EXIT

set var (cmd ^ $tmpf)
set var_err (cat $tmpf)

相关内容