69

で次のコマンドを実行すると、csh何も得られませんが、で機能しbashます。csh標準エラーを標準出力にリダイレクトできる同等のものはありますか?

somecommand 2>&1
4

6 に答える 6

91

シェルcshは、リダイレクトプロセスでファイルハンドルを操作する広範な機能で知られていません。

標準出力とエラーの両方を次のファイルにリダイレクトできます。

xxx >& filename

しかし、それはあなたが求めていたものではなく、標準エラーを現在の標準出力にリダイレクトします。


ただし、基盤となるオペレーティングシステムがファイルシステム内のプロセスの標準出力を公開している場合(Linuxの場合のように/dev/stdout)、その方法は次のように使用できます。

xxx >& /dev/stdout

これにより、標準出力と標準エラーの両方が現在の標準出力と同じ場所に移動し、事実上、bashリダイレクトで得られるものになります2>&1

これはcsh機能ではないことに注意してください。標準出力をファイルとして公開しないオペレーティングシステムで実行している場合、この方法は使用できません。


ただし、別の方法があります。を使用してパイプラインに送信する場合は、2つのストリームを1つに結合でき|&ます。必要なのは、標準入力を標準出力に書き込むパイプラインコンポーネントを見つけることだけです。catあなたがそのようなことに気づいていない場合、あなたがそれに議論を与えなければ、それはまさにそれが何をするかです。したがって、この特定のケースでは、次の方法で目的を達成できます。

xxx |& cat

もちろん、追加機能を提供するために、スクリプトbashで実行することを妨げるものは何もありません(システムのどこかにあると仮定します) 。次に、そのシェルの豊富なリダイレクトを使用して、問題が発生する可能性のあるより複雑なケースに使用できます。cshcsh

これをさらに詳しく調べてみましょう。まず、次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"

echoPIDのは、このスクリプトを実行しているpsことを確認できるようにするためのものです。cshこのスクリプトを次のコマンドで実行する場合:

./test.csh >test.out 2>test.err

(最初のリダイレクトは、スクリプトの実行を開始するbash 前に 設定されます)、ファイルを調べると、次のようになります。cshout/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>&1inを使用すると、標準出力が現在どこに向かっているのかを事前に知らなくても、標準エラーを現在のbash標準出力に(必要に応じて)簡単にリダイレクトできます。

于 2012-12-05T09:49:09.117 に答える
43

私は上記の答えに反対し、私自身を提供します。cshこの機能はありますか。その方法は次のとおりです。

xxx |& some_exec # will pipe merged output to your some_exec 

また

xxx |& cat > filename

または、ストリームを(stdoutに)マージし、ファイルまたはsome_execにリダイレクトしないようにする場合:

xxx |& tee /dev/null
于 2014-01-25T01:04:31.783 に答える
39

>&paxdiabloが言ったように、stdoutとstderrの両方をリダイレクトするために使用できます。ただし、それらを分離したい場合は、以下を使用できます。

(command > stdoutfile) >& stderrfile

...上記のように、stdoutをstdoutfileにリダイレクトし、stderrをstderrfileにリダイレクトします。

于 2014-01-23T16:05:39.417 に答える
4

ただどうですか

xxx >& /dev/stdout

???

于 2014-11-07T13:24:29.637 に答える
4
   xxx >& filename

または、これを実行して画面上のすべてを表示し、ファイルに移動させます。

  xxx | & tee ./logfile
于 2015-02-27T18:58:52.450 に答える
-1

これが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環境ではうまくいきません。

于 2014-02-13T16:42:33.730 に答える