stderr 和 stdout 的行为不同
Behavior of stderr and stdout differs
当 运行 到 tcsh
和 ksh
时,stdout 和 stderr 给出不同的结果。
根据我的理解,ksh
中的行为是正确的,而在 tcsh 中则不是。
我的目的是了解 cout
和 cerr
之间的区别,所以我写了一个小的 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
难道 stderr
、stdout
的行为在 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
中确实没有办法将错误输出仅重定向到一个文件。
tcsh
和 ksh
时,stdout 和 stderr 给出不同的结果。
根据我的理解,ksh
中的行为是正确的,而在 tcsh 中则不是。
我的目的是了解 cout
和 cerr
之间的区别,所以我写了一个小的 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
难道 stderr
、stdout
的行为在 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
中确实没有办法将错误输出仅重定向到一个文件。