ksh将stdout和stderr重定向到不同的进程

时间:2011-06-27 13:18:18

标签: pipe ksh

如何在UNIX上重定向stdout管道和stderr管道nn ksh? (不是Linux)。

以下工作重定向到文件:

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

2 个答案:

答案 0 :(得分:1)

Process substitution

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

答案 1 :(得分: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
在执行以下命令之前,

注意:名为blu 的文件不存在。)

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

bash: blu: No such file or directory

现在如果列出目录,你会看到一个蓝色创建。那是因为cat bla&gt; blu正确执行但在执行整个命令之前没有文件。因此当sort尝试读取blu时,它会抛出一个错误,因为它不存在。不要错误地误用“|”为一个 ”;” 。它们完全不同。 希望这有帮助。