stdoutを置き換えずにgrepを使用してstdoutを検索する

stdoutを置き換えずにgrepを使用してstdoutを検索する

現在私はこれをラッパースクリプトに入れました。

2>&1 ./update.sh | ts | tee -a ./update.log

update.shから:

if apt full-upgrade -y | grep linux-headers
then
    echo
    echo Need to Fix the Capture Driver!
fi

(ドライバを自動的に修正する追加のロジックがありますが、理解しているようです。)

apt full-upgrade動作しますが、端末またはログファイルに出力全体が表示されません。一致するコンテンツのみを取得しますgrep

before、then、およびbefore一時ファイルにteeフル出力を実行できますが、apt full-upgrade端末全体とログを取得してロジックを保存するよりも良い方法はありますか?ifgreprm

答え1

/dev/stdoutパイプを指しているため、ここでは使用できません。 1つのアプローチは、スクリプトの生のstdoutコピーを取得して印刷することですtee(テストされていません)。

exec 9>&1    # make fd 9 a copy of the current stdout
apt full-upgrade -y | tee /dev/fd/9 | grep linux-headers
exec 9>&-    # close fd 9

出力全体を常に端末に送信するには、次のものを使用できます/dev/tty

apt full-upgrade -y | tee /dev/tty | grep linux-headers

ただし、これにより、スクリプト全体にどのリダイレクトが適用されても、出力が端末に移動します。


場合によっては、プロセス置換を使用して出力をstdout以外のコマンドにリダイレクトできます。

apt full-upgrade -y | tee >(grep linux-headers)

ただし、シャットダウン状態が必要であり、grepプロセスの交換により簡単に取得できないため、ここでは機能しません。

関連情報