stderrリダイレクトがcshで機能しない


11

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

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を実行しています。

回答:


12

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

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

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


+1と✔。を使用してシェルを変更しましたsh
gadgetmo 2012

1
@Craig彼pkg_addはFreeBSDで実行しているので、これはrootユーザー用であると想定しています(/ bin / cshがFreeBSDのrootのデフォルトです)。この場合、シェルを/ usr / local / bin / bashに変更しないでください。/ bin / shは受け入れ可能です。rootとしてログインした後、別のシェルに切り替えることもできます。
James O'Gorman

@ JamesO'Gormanグッドキャッチ私は私の答えを更新しました。
クレイグ

20

あなたが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

編集:これが機能する理由は、()のアクションが最初に発生するためです。Ergo、STDOUTをリダイレクトした場合、()の外では使用できなくなります。これにより、STDERRだけが残り、必要に応じてリダイレクトできます。


こんにちは@ nikc、unix.SEへようこそ。あなたのコメントは有用で有益です。簡単に見逃さないように、回答を編集してそこに直接含めることをお勧めします。
Drs

1

私はCshでそれを行う方法を知っていますが、2つのシェルを使用しています:

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

このような方法により、stdoutを使用せずにstderr のみをfile.txt にリダイレクトできます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.