stderr リダイレクトが csh で動作しない

stderr リダイレクトが csh で動作しない

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

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

関連情報