終了状態を維持しながらプロセス出力をフィルタリングする方法

終了状態を維持しながらプロセス出力をフィルタリングする方法

私の設定ファイルには、引数に指定されたコマンドラインを呼び出し、失敗したときに標準出口を呼び出す単純な小さなシェル関数があります。

function my_exec() {
  if [ "$1" != "" ]; then
    $*                       # WANT FILTER HERE
    my_test $? $*
  fi
}
function my_test() {
  if [ $1 -ne 0 ]; then
    ecval=$1
    shift
    if [ "$1" !- "" ]; then
      my_exit "Exited with error $ecval from $*"
    else
      my_exit "Exited with error $ecval"
    fi
  fi
}
function my_exit() {
  echo "ERROR: " $* 2>&1
  if [ `basename $0`  = "go.sub.sh" ]; then
    echo "ERROR" > go.sub.${occ}.done
  fi
  exit 1
}

この関数によって実行されるプロセスの1つは、フィルタリングしたい多くの出力を生成します。

可能であれば、WANT FILTER HEREとマークされた行を次のように置き換えたいと思います(実際のフィルタは$ 1コマンドの値によって異なります)。

$* | grep -v "^INFO:" | grep -v "^NOTE:"

しかし、これはもちろん次の$?テストを裏返します。コマンド終了コードを失うことなくコマンド出力をフィルタリングする方法はありますか?すべての出力をファイルにリダイレクトし、状態を保存し、ファイルを逆方向​​にgrepしたくありません。特に、ユーザーはこのタスクの実行をリアルタイムで見て進行状況を確認できるからです。

ありがとう、ティー

ベストアンサー1

BashPIPESTATUS配列は、パイプライン内のすべてのコマンドのステータスコードを保持します。

最初のプログラムの終了コードの場合:

echo "${PIPESTATUS[0]}"

一緒にパイプされるすべてのプログラムの終了コード:

echo "${PIPESTATUS[@]}"

おすすめ記事