クラッシュレポートをSTDERR
にダンプするプログラムを実行しています。そこから、いくつかの必要な情報をフィルタリングする必要があります。問題は、STDERR
をSTDOUT
にリダイレクトできず、PIPE
をgrep
でリダイレクトできないことです。
command 2>&1 >/dev/null | grep "^[^-]" >& /tmp/fl
エラーの取得:Ambiguous output redirect.
同じコマンドがbashターミナルで機能します。それを機能させるには何を変更する必要がありますか?
csh
は、ファイルのリダイレクトに関して、bashよりも大幅に制限されています。 csh
では、通常の>
演算子を使用してstdout
をリダイレクトでき、>&
演算子を使用してstdout
とstderr
の両方をリダイレクトできます。stdout
とstderr
とstderr
を|&
.
通常の回避策は、サブシェルでコマンドを実行し、そのサブシェルのstdout
を任意のファイル(この場合は/dev/null
)にリダイレクトしてから、|&
演算子を使用してサブシェルのstdout
とstderr
をリダイレクトすることです。メインシェルの次のコマンド。
あなたの場合、これは次のような意味です。
( command >/dev/null ) |& grep "^[^-]" >&/tmp/fl
stdout
はサブシェル内の/dev/null
にリダイレクトされるため、|&
演算子はbashで2>&1
として機能することになります-stdout
はサブシェルで破棄されるため、stdout
に書き込まれたものはパイプに到達しません。
Stdoutとstderrをパイプに混ぜてもかまわない場合は、
command |& grep "^[^-]" >& /tmp/fl
それ以外の場合は、ハックを行うことができます:
(command >/dev/null) |& grep "^[^-]" >& /tmp/fl
これはstdoutをnullに分離し、stdoutとstderrをパイピングするとstderrがコンテンツとして提供されます。