stderrからstdoutへ - リダイレクト以外の他のオプションはありますか?

stderrからstdoutへ - リダイレクト以外の他のオプションはありますか?

standard error...についての私のstandard output知識は非常に限られています。

一般的な方法の1つはstandard errorにリダイレクトすることです。これは、リダイレクトのためにstandard outputエラー(通常発生するエラー)が再現されないことを意味しますか?standard errorstandard error

standard errorこれが真であれば、コピーしてコピーをリダイレクトし、元のコンテンツをstandard output期待どおりにリダイレクトする方法はありますか?standard error

ベストアンサー1

私がUnixを初めて使用したとき、誰かがパイプがパイプのように動作することを説明しました。

プロセスには基本的に塗りつぶすための3つの接続点があります。

           stdin
             |
          +--+--+
          | pgm |
          ++---++
           |   |
      stdout   stderr

したがって、これを行うと、次のようなcat | grep pattern結果が得られます。

         stdin
           |
        +--+--+
        | cat |
        ++---++
   stdout|   |stderr
         |   \
    stdin|    \
     +------+  |
     | grep |  |
     +-+---++  |
 stdout|   |   |
       |   \__ |
       |      \|
       |       |stderr

(当時は全てアスキーグラフィックだったのに…)

示されているようにstderrをstdoutにリダイレクトすると、pgm 2>&1図は次のようになります。

    stdin |
          |
       +--+--+
       | pgm |
       ++---++
  stdout|   |stderr
        |   /
        |  /
        | /
        |/
        |

理論的には、この方法で多くの配管作業を実行できます。たとえば、awk '{print;print > "/dev/stderr"}'stdinをstdoutとstderrにコピーします。

しかし、非常に急速に混乱する可能性があります。詳細については、bashのマニュアルを参照してください。

メモ:pgm = 上図のプログラムです。

編集:楽しく、単純なシェルスクリプトを使ってもう少し複雑な配管を試してみました。

generate.sh:

echoerr() { echo "$@" 1>&2; }
for i in 1 2 3 4 5 6 ; do
        echo "STDOUT $i"
        echoerr "STDERR $i"
done

そしてcopytee.sh

#!/bin/bash
echoerr() { echo "$@" 1>&2; }
while read line; do
        echo "stdout $line"
        echoerr "stderr $line"
done

(コピー広告は小文字、生成は大文字です)

高度な形式のリダイレクトを取得するには、bash generate.sh 2> >(bash copytee.sh ) 次のように出力します。

STDOUT 1
STDOUT 2
STDOUT 3
STDOUT 4
STDOUT 5
STDOUT 6
stdout STDERR 1
stderr STDERR 1
stdout STDERR 2
stderr STDERR 2
stdout STDERR 3
stderr STDERR 3
stdout STDERR 4
stderr STDERR 4
stdout STDERR 5
stderr STDERR 5
stdout STDERR 6
stderr STDERR 6

これがまさにあなたが要求したものです。

おすすめ記事