Fish Shellでstdoutとstderrを別々の変数としてキャプチャする

Fish Shellでstdoutとstderrを別々の変数としてキャプチャする

可能ですか?

コマンドを実行したいのですが、stdoutとstderrを別々の変数としてキャプチャしたいと思います。現在私はset -l var (cmd)stderrを変更せずにそのまま維持するthisを使用しています。 stdoutとstderrをvarにマージすることはできますが、set -l var (cmd ^&1)再び簡単に分離することはできません。

varとvar_errにcmdにstdoutとstderrを保存させる方法はありますか?

答え1

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

~から魚の皮/魚の殻#2463

Fish の例の 1 つの問題は [read] の [cmd] と [stdout] をリダイレクトするので、後者が何でも印刷するとパイプされます。

しかし、一般的な状況では、readが何も印刷してはならないと思います(特にstdoutで)。したがって、大丈夫でしょう。

編集する:正確なセマンティクスが必要な場合は、以下を使用してこれを達成できますset var (cmd)set var (printf '%s' $out)set var_err (printf '%s' $err)

答え2

最も簡単な方法は、ストリームの1つをファイルにリダイレクトすることです。

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

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

関連情報