stderr 和 stdout 的行为不同

Behavior of stderr and stdout differs

当 运行 到 tcshksh 时,

stdout 和 stderr 给出不同的结果。 根据我的理解,ksh 中的行为是正确的,而在 tcsh 中则不是。 我的目的是了解 coutcerr 之间的区别,所以我写了一个小的 C++ 程序:

    std::cout<<"this goes in standard output\n";
    std::cerr<<"This goes in error output\n";

并生成 out 作为可执行文件。

我制作了两个 shell 脚本,一个用于 ksh,另一个用于 tcsh,如下所示:

:~/CPP/TEST [124]$ cat test
#!/bin/tcsh

      out 2>>error.log

:~/CPP/TEST [125]$ cat test1
#!/usr/bin/ksh

out 2>>error.log

:~/CPP/TEST [129]$ ./test
This goes in error output            //WRONG
:~/CPP/TEST [130]$ cat error.log
this goes in standard output         //WRONG
:~/CPP/TEST [131]$ ./test1
this goes in standard output         //OK
:~/CPP/TEST [132]$ cat error.log
this goes in standard output
This goes in error output            //OK

难道 stderrstdout 的行为在 shell 之间应该是一样的吗?

根据this tcsh manual page你需要使用>>&重定向错误输出(以及标准输出)

该手册还指出

The shell cannot presently redirect diagnostic output without also redirecting standard output, but (command >> output-file) >& error-file is often an acceptable workaround.

总而言之,在 tcsh 中确实没有办法将错误输出仅重定向到一个文件。