cshでstderrリダイレクトが機能しません

cshでstderrリダイレクトが機能しません

次のコマンドを実行します。

pkg_add emacs-23.4,2.tbz 2> output.log

出力は依然として端末に表示されます。押すと手に入る

pkg_add emacs-23.4,2.tbz 2 > output.log

前にスペースがあります。2

最初はこれを入れませんでした。頑張る

pkg_add emacs-23.4,2.tbz > output.log 2>&1

もう一度押すと追加されたスペース

私にとってなぜこれが起こったのですか?

私はFreeBSDでcshを実行しています。

答え1

STDERRを非表示にするのかSTDOUTにリダイレクトしたいのかわかりません。

STDOUTをファイルにリダイレクトするには:

pkg_add emacs-23.4,2.tbz > stdout.log

STDOUTとSTDERRをファイルにリダイレクトするには:

pkg_add emacs-23.4,2.tbz > & stdxxx.log

STDOUTをファイルにリダイレクトしてSTDERRを非表示にするには、次のようにします。

( pkg_add emacs-23.4,2.tbz > stdout.log ) > & /dev/null

STDOUTをコンソールにリダイレクトし、STDERRを非表示にします。

( pkg_add emacs-23.4,2.tbz > /dev/tty ) > & /dev/null

STDOUTをコンソールにリダイレクトし、STDERRをファイルにリダイレクトします。

( pkg_add emacs-23.4,2.tbz > /dev/tty ) > & stderr.log

STDOUTをファイルにリダイレクトし、STDERRをファイルにリダイレクトします。

( pkg_add emacs-23.4,2.tbz > stdout.log ) > & stderr.log

編集:その理由は、()内部の作業が最初に発生するためです。したがって、STDOUT をリダイレクトすると () 外部で使用できなくなります。これによりSTDERRが残り、必要に応じてリダイレクトできます。

答え2

2> cshまたはtcshではリダイレクトは機能しません。

スタイルリダイレクトを使用するには、このchshコマンドを使用してシェルを/bin/shまたは/usr/local/bin/bashに変更します2>メモ:ルートのシェルを/usr/local/bin/bashに変更しないでください。

cshとtcshは標準出力とエラーを個別にリダイレクトできませんが、結合された>&出力をファイルにリダイレクトします。

答え3

Cshでこれを行う方法を知っていますが、2つのシェルを使用してください。

csh -c 'SOME_COMMAND 1>/dev/null' |& tee file.txt

これにより、リダイレクトが許可されます。ただstderrをfile.txtとして、stdoutを使用しない - それはあなたが望むものです。

答え4

nikcの答えに関してBourneシェルと同じ動作を達成するには、/dev/ttyFIFOを使用します。

STDOUTをコンソールにリダイレクトし、STDERRを非表示にします。

mkfifo stdout
( pkg install -y emacs > stdout ) >& /dev/null & cat stdout

STDERRをコンソールにリダイレクトしてSTDOUTを非表示にするには、次の手順に従ってください。

pkg install -y emacs > /dev/null

関連情報