2011-06-27 15 views
1

UNIXでstdoutパイプとstderrパイプnn kshをリダイレクトする方法はありますか? (Linuxではなく)。ksh stdoutとstderrを別のプロセスにリダイレクト

次は、ファイルにリダイレクトするように動作します:

x=0 
while [[ "$x" -lt 100 ]]; do 
    echo "junk" >&2 
    echo "$x log test" 
    echo "junk err" &>2 
    echo "$x err test" >&2 
    x=$(($x+1)) 
done 2>out1.err 1>out1.log 

私は次のように、他のプロセスにパイプをリダイレクトするようなものを試してみたが、これは動作しません:

x=0 
while [[ "$x" -lt 100 ]]; do 
    echo "junk" >&2 
    echo "$x log test" 
    echo "junk err" &>2 
    echo "$x err test" >&2 
    x=$(($x+1)) 
done 2>&3 | sort -u > out2.log 3>&1 | sort -u > out2.err 

答えて

1

Process substitution

some_process 1> >(do_something_with stdout) 2> >(do_something_else_with stderr) 
+0

はそれがbashのマニュアルへのリンクだ、 'kshの' タグを逃しました。それにもかかわらず、構文は同じです。 –

+0

ありがとうございます。@ Mathtick:コマンド/プロセスの置き換えの例をリンクしています:http://www.linuxjournal.com/article/2156?page=0,1 – tomkaith13

0

これは、あなたのコードに問題があります2>&3 | sort -u > out2.log 3>&1。コマンドが完全に実行されるまで、パイプはFDまたはファイルをリンクしません。

bash-4.0$ cat bla 
0 
1 
2 
3 
4 
5 
6 
7 
8 
9 
10 
11 
12 
13 
14 
15 
16 
17 
18 
19 

はたとえば、次のファイルBLA考える(注:私は、次のコマンドを実行する前のBlu と呼ばれるファイルが存在しない)を今すぐ

bash-4.0$ cat bla > blu | sort < blu 

bash: blu: No such file or directory 

場合ディレクトリをリストアップすると、作成されたブルーが表示されます。 cat bla> bluは正しく実行されたが、コマンド全体が実行されるまでファイルが作成されなかったためです。したがって、ソートがブルーを読み込もうとすると、エラーが発生します。存在しません。いいえ、間違って "|"のために ";" 。彼らは完全に異なっています。 これが役に立ったと思います。

関連する問題