次のコマンドを実行します。
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/tty
FIFO を使用します。
STDOUT をコンソールにリダイレクトし、STDERR を非表示にするには:
mkfifo stdout
( pkg install -y emacs > stdout ) >& /dev/null & cat stdout
STDERR をコンソールにリダイレクトし、STDOUT を非表示にするには:
pkg install -y emacs > /dev/null