私の目標は、コマンドを呼び出して変数から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
cmd
stdoutを変更せずにstderrを取得するには(ここではfd 3を使用して)インポートする3>&1
コマンド置換の元のstdout(コピー)(>&3
fd 2をコマンド置換によって生成されたパイプにリダイレクトした後に復元されます2>&1
)。