
私の設定ファイルには、引数に指定されたコマンドラインを呼び出し、失敗したときに標準出口を呼び出す単純な小さなシェル関数があります。
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[@]}"