2011-06-27 64 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

錯過了 '的ksh' 的標籤,這是對的bash手冊的鏈接。不過,語法是一樣的。 –

+0

謝謝你。@ Mathtick:這是一個鏈接命令/過程替代的例子:http://www.linuxjournal.com/article/2156?page=0,1 – tomkaith13

0

這是問題與您的代碼2>&3 | sort -u > out2.log 3>&1。在命令完全執行之前,管道不會鏈接FD或文件。

例如,請考慮以下文件BLA:

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 

注意:所謂的藍光文件不存在我執行下面的命令之前)

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

bash: blu: No such file or directory 

現在,如果你列出目錄你會看到一個藍光創建。這是因爲cat bla> blu正確執行,但是在整個命令執行之前沒有文件被創建。因此,當排序嘗試讀取藍光它引發錯誤因爲它不存在。不要誤用濫用「|」爲一個 」;」 。他們完全不同。 希望這有助於。

相關問題