エラー(stderr)をフィルタリングするためにBashにエイリアスまたは関数を書くことは可能ですか?

エラー(stderr)をフィルタリングするためにBashにエイリアスまたは関数を書くことは可能ですか?

私は時々これをする

grep -ri foo .

ただし、一部のnode_modulesには存在しない場所へのリンクがある場合があります。だから私は

grep -ri foo . 2>&-

または

grep -ri foo . 2> /dev/null

しかし、時には覚えにくいときもあります。エイリアスを作成して

grep -ri foo . | discarderr 

動作できますか? stdoutだけに渡されるのでこれが難しいと思います。 stderrとstdoutの両方を渡してエラーを削除するdiscarderr方法がない可能性があります。discarderrdiscarderr

alias discarderr='cat 2> /dev/null'

これを行う方法はありますか?それとも関数を介して実行できますが、そのような場合は少しぎこちないように見えますかdiscarderr(grep -ri foo .)

-sgrepにはエラーメッセージを削除する機能があるようです。しかし、他のコマンドの一般的な解決策はどうですか?

ベストアンサー1

1つ以上の引数で指定されたコマンドを実行し、標準エラーストリームを削除するシェル関数:

discarderr () {
    "$@" 2>/dev/null
}

同じ機能を持つエイリアス:

alias discarderr='2>/dev/null'

どちらも同じ方法で使用されます。

discarderr some-command

2>/dev/null...長期的に、これはコマンドを混乱させる可能性があり、コマンドに追加するよりも面倒です。たとえば、使用しているすべてのシステムでエイリアスまたは関数をインスタンス化する必要があることを覚えておく必要があります。スクリプトで関数を使用すると、コードを検索している人から診断メッセージが削除されることが隠されます。

また、診断メッセージは次のとおりです。効果がある理想的には、これを介してデータにアクセスしようとするプログラムでエラーを引き起こすという事実を解決するのではなく、死んだシンボリックリンクなどの問題を修正する必要があります。

また、を使用すると、discarderr「奇妙な」問題をデバッグするのがより困難になる可能性があります。たとえば、コマンドが実行されたことを確認できません。別の言葉たとえば、discarderr grapgrepスペルエラー)は何も出力しません。

おすすめ記事