csh
で次のコマンドを実行すると、何も得られませんでしたが、bash
で動作します。標準エラーを標準出力にリダイレクトできるcsh
に同等のものはありますか
somecommand 2>&1
csh
シェルは、リダイレクトプロセスでファイルハンドルを操作する広範な機能で知られたことはありません。
以下を使用して、標準出力とエラーの両方をファイルにリダイレクトできます。
xxx >& filename
しかし、それはあなたが望んでいたことではなく、標準エラーをcurrent標準出力にリダイレクトします。
ただし、基になるオペレーティングシステムがファイルシステム内のプロセスの標準出力を公開する場合(Linuxが/dev/stdout
で行うように)、次のようにそのメソッドを使用できます。
xxx >& /dev/stdout
これにより、両方の標準出力and標準エラーが現在の標準出力と同じ場所に送られ、bash
リダイレクト、2>&1
で効果的になります。
これはcsh
機能ではないことに注意してください。 does n'tを標準出力をファイルとして公開するオペレーティングシステムで実行する場合、このメソッドは使用できません。
ただし、別の方法があります。 |&
でpipelineに送信する場合、2つのストリームを1つに結合できます。必要なことは、標準入力を標準出力に書き込むパイプラインコンポーネントを見つけることだけです。あなたがそのようなことを知らない場合、それはあなたがそれに引数を与えない場合cat
がまさにすることです。したがって、次のようにしてspecificのケースで目的を達成できます。
xxx |& cat
もちろん、bash
の実行を妨げるものは何もありません(システムのどこかにあると仮定します)within a csh
スクリプトで追加機能を提供します。次に、csh
が苦労する可能性のあるより複雑な場合に、そのシェルの豊富なリダイレクトを使用できます。
これについてさらに詳しく見ていきましょう。最初に、文字列をstderr
に書き込む実行可能ファイルecho_err
を作成します。
#include <stdio.h>
int main (int argc, char *argv[]) {
fprintf (stderr, "stderr (%s)\n", (argc > 1) ? argv[1] : "?");
return 0;
}
次に、制御スクリプトtest.csh
を実行します:
#!/usr/bin/csh
ps -ef ; echo ; echo $$ ; echo
echo 'stdout (csh)'
./echo_err csh
bash -c "( echo 'stdout (bash)' ; ./echo_err bash ) 2>&1"
PIDのecho
とps
は、このスクリプトを実行するcsh
であることを確認するためのものです。このスクリプトを次のように実行すると:
./test.csh >test.out 2>test.err
(最初のリダイレクトはbash
beforecsh
によってセットアップされ、スクリプトの実行を開始します)、out/err
ファイルを調べます。
test.out:
UID PID PPID TTY STIME COMMAND
pax 5708 5364 cons0 11:31:14 /usr/bin/ps
pax 5364 7364 cons0 11:31:13 /usr/bin/tcsh
pax 7364 1 cons0 10:44:30 /usr/bin/bash
5364
stdout (csh)
stdout (bash)
stderr (bash)
test.err:
stderr (csh)
test.csh
プロセスisがCシェルで実行されており、そこからbash
を呼び出すと、完全なbash
リダイレクトのパワーが得られることがわかります。
bash
コマンドの2>&1
を使用すると、標準出力が現在どこにあるのかを事前に知らなくても、標準エラーをcurrent標準出力(必要に応じて)に簡単にリダイレクトできます。
上記の答えに反対し、自分で答えます。 csh
にはこの機能があります。その方法は次のとおりです。
xxx |& some_exec # will pipe merged output to your some_exec
または
xxx |& cat > filename
または、ストリームを(stdoutに)マージするだけで、ファイルやsome_execにリダイレクトしない場合:
xxx |& tee /dev/null
Paxdiabloが言ったように、>&
を使用してstdoutとstderrの両方をリダイレクトできます。ただし、それらを分離する場合は、次を使用できます。
(command > stdoutfile) >& stderrfile
...上記のように、stdoutはstdoutfileにリダイレクトされ、stderrはstderrfileにリダイレクトされます。
どうでしょう
xxx >& /dev/stdout
???
xxx >& filename
または、これを実行して画面上のすべてを表示し、ファイルに保存します。
xxx | & tee ./logfile