web-dev-qa-db-ja.com

Cシェルでstderrをstdoutにリダイレクトします

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

somecommand 2>&1
57
zdd

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のechopsは、このスクリプトを実行するcshであることを確認するためのものです。このスクリプトを次のように実行すると:

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

(最初のリダイレクトはbashbeforecshによってセットアップされ、スクリプトの実行を開始します)、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標準出力(必要に応じて)に簡単にリダイレクトできます。

75
paxdiablo

上記の答えに反対し、自分で答えます。 cshにはこの機能があります。その方法は次のとおりです。

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

または

xxx |& cat > filename

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

xxx |& tee /dev/null
42
bioffe

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

(command > stdoutfile) >& stderrfile

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

35
Chris

どうでしょう

xxx >& /dev/stdout

???

4
ChPortos
   xxx >& filename

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

  xxx | & tee ./logfile
4
Ryan P