変数からstderrをリダイレクトするが、コンソールでstdoutを保持する方法

変数からstderrをリダイレクトするが、コンソールでstdoutを保持する方法

私の目標は、コマンドを呼び出して変数からstderrを取得しますが、画面にはstdout(およびstdoutのみ)を保持することです。はい、それはほとんどの人がやっているのと反対です:)

現在私が持っている最高は次のとおりです。

#!/bin/bash
pull=$(sudo ./pull "${TAG}" 2>&1)
pull_code=$?

if [[ ! "${pull_code}" -eq 0 ]]; then
  error "[${pull_code}] ${pull}"
  exit "${E_PULL_FAILED}"
fi

echo "${pull}"

ただし、これは成功時とコマンドが完了した後にのみ標準出力を表示します。標準出力をストリーミングしたいです。これは可能ですか?

編集する

@sebasth と協力していただきありがとうございます。一時ファイルなしでSTDERRとSTDOUTを別の変数にリダイレクトする、私は次のように書いています。

#!/bin/bash
{
  sudo ./pull "${TAG}" 2> /dev/fd/3
  pull_code=$?
  if [[ ! "${pull_code}" -eq 0 ]]; then
    echo "[${pull_code}] $(cat<&3)"
    exit "${E_PULL_FAILED}"
  fi
} 3<<EOF
EOF

私はこれが実際に「美しくない」ことを認め、難しいように見え、heredocがなぜ必要なのか本当に理解していません...

これがこれを達成するより良い方法ですか?

ベストアンサー1

ちょうど使用:

{ err=$(cmd 2>&1 >&3 3>&-); } 3>&1

cmdstdoutを変更せずにstderrを取得するには(ここではfd 3を使用して)インポートする3>&1コマンド置換の元のstdout(コピー)(>&3fd 2をコマンド置換によって生成されたパイプにリダイレクトした後に復元されます2>&1)。

おすすめ記事