web-dev-qa-db-ja.com

cshでstderrをリダイレクトする

クラッシュレポートをSTDERRにダンプするプログラムを実行しています。そこから、いくつかの必要な情報をフィルタリングする必要があります。問題は、STDERRSTDOUTにリダイレクトできず、PIPEgrepでリダイレクトできないことです。

command 2>&1 >/dev/null | grep "^[^-]" >& /tmp/fl

エラーの取得:Ambiguous output redirect.

同じコマンドがbashターミナルで機能します。それを機能させるには何を変更する必要がありますか?

9
PYPL

cshは、ファイルのリダイレクトに関して、bashよりも大幅に制限されています。 cshでは、通常の>演算子を使用してstdoutをリ​​ダイレクトでき、>&演算子を使用してstdoutstderrの両方をリダイレクトできます。stdoutstderrstderr|&.

通常の回避策は、サブシェルでコマンドを実行し、そのサブシェルのstdoutを任意のファイル(この場合は/dev/null)にリダイレクトしてから、|&演算子を使用してサブシェルのstdoutstderrをリ​​ダイレクトすることです。メインシェルの次のコマンド。

あなたの場合、これは次のような意味です。

( command >/dev/null ) |& grep "^[^-]" >&/tmp/fl

stdoutはサブシェル内の/dev/nullにリダイレクトされるため、|&演算子はbashで2>&1として機能することになります-stdoutはサブシェルで破棄されるため、stdoutに書き込まれたものはパイプに到達しません。

12

Stdoutとstderrをパイプに混ぜてもかまわない場合は、

command |& grep "^[^-]" >& /tmp/fl

それ以外の場合は、ハックを行うことができます:

(command >/dev/null) |& grep "^[^-]" >& /tmp/fl

これはstdoutをnullに分離し、stdoutとstderrをパイピングするとstderrがコンテンツとして提供されます。

5
meuh