这可能吗?
我想运行一个命令,但将其 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
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)