で次のコマンドを実行すると、csh
何も得られませんが、で機能しbash
ます。csh
標準エラーを標準出力にリダイレクトできる同等のものはありますか?
somecommand 2>&1
で次のコマンドを実行すると、csh
何も得られませんが、で機能しbash
ます。csh
標準エラーを標準出力にリダイレクトできる同等のものはありますか?
somecommand 2>&1
シェルcsh
は、リダイレクトプロセスでファイルハンドルを操作する広範な機能で知られていません。
標準出力とエラーの両方を次のファイルにリダイレクトできます。
xxx >& filename
しかし、それはあなたが求めていたものではなく、標準エラーを現在の標準出力にリダイレクトします。
ただし、基盤となるオペレーティングシステムがファイルシステム内のプロセスの標準出力を公開している場合(Linuxの場合のように/dev/stdout
)、その方法は次のように使用できます。
xxx >& /dev/stdout
これにより、標準出力と標準エラーの両方が現在の標準出力と同じ場所に移動し、事実上、bash
リダイレクトで得られるものになります2>&1
。
これはcsh
機能ではないことに注意してください。標準出力をファイルとして公開しないオペレーティングシステムで実行している場合、この方法は使用できません。
ただし、別の方法があります。を使用してパイプラインに送信する場合は、2つのストリームを1つに結合でき|&
ます。必要なのは、標準入力を標準出力に書き込むパイプラインコンポーネントを見つけることだけです。cat
あなたがそのようなことに気づいていない場合、あなたがそれに議論を与えなければ、それはまさにそれが何をするかです。したがって、この特定のケースでは、次の方法で目的を達成できます。
xxx |& cat
もちろん、追加機能を提供するために、スクリプト内bash
で実行することを妨げるものは何もありません(システムのどこかにあると仮定します) 。次に、そのシェルの豊富なリダイレクトを使用して、問題が発生する可能性のあるより複雑なケースに使用できます。csh
csh
これをさらに詳しく調べてみましょう。まず、次echo_err
の文字列を書き込む実行可能ファイルを作成しstderr
ます。
#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"
echo
PIDのは、このスクリプトを実行しているps
ことを確認できるようにするためのものです。csh
このスクリプトを次のコマンドで実行する場合:
./test.csh >test.out 2>test.err
(最初のリダイレクトは、スクリプトの実行を開始するbash
前に 設定されます)、ファイルを調べると、次のようになります。csh
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
プロセスがCシェルで実行されており、そこから呼び出すと、リダイレクトbash
の全機能が提供されることがわかります。bash
コマンドの2>&1
inを使用すると、標準出力が現在どこに向かっているのかを事前に知らなくても、標準エラーを現在のbash
標準出力に(必要に応じて)簡単にリダイレクトできます。
私は上記の答えに反対し、私自身を提供します。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
これがcshの正解だと思います。
xxx >/dev/stderr
最近の環境では、ほとんどのcshが実際にはtcshであることに注意してください。
rmockler>ls -latr /usr/bin/csh
lrwxrwxrwx1ルートルート92011-05-0313:40 / usr / bin / csh-> / bin / tcsh
バッククォートの埋め込みステートメントを使用して、これを次のように表現します。
echo "`echo 'standard out1'` `echo 'error out1' >/dev/stderr` `echo 'standard out2'`" | tee -a /tmp/test.txt ; cat /tmp/test.txt
これがうまくいく場合は、1に上げてください。他の提案は私のcsh環境ではうまくいきません。