stderr redirection methods

a 夏天 提交于 2019-12-08 12:39:50

问题


I am running tcsh/csh shell on my machine. lately i have realized my stderr file redirection is not working.

Please find the terminal logs as below:

>echo b c >>& log
>cat log
b c
>echo $a b c >>& log
a: Undefined variable.
>cat log
b c

I have never faced such issues, hence not sure how to debug or troubleshoot. Please advice!

An alterate method of redirection is using tee. While I use >& or >>& , i am altogether blocking any output to be displayed on terminal. Is there a way I can do both, that is: for each statement

a) direct stdout+stderr to a file.

b) display stdout+stderr on terminal

I need to confirm if i can use something like this(below) to meet my requirements

>csh ./script_name | tee -a log

In my case it only directs stdout to log file and blocks stderr.


回答1:


I'm pretty certain that the evaluation of $a is being done by the current shell, before the redirection is set up for the echo subshell?

It seems to be supported by the fact that the echo isn't actually writing to the file at all, which you could see if you deleted the log file before the second attempt:

[pax ~]$ echo b c >>& log

[pax ~]$ cat log
b c

[pax ~]$ rm log

[pax ~]$ echo $a b c >> & log
a: Undefined variable.

[pax ~]$ cat log
cat: log: No such file or directory

And also by the fact that, if you run the echo in an explicit subshell with the redirection done for the subshell rather than the echo, you get your desired result:

[pax ~]$ ( echo $a b c ) >> & log

[pax ~]$ cat log
b c
a: Undefined variable.

In fact, you can see this without even using a valid command:

[pax ~]$ rm log

[pax ~]$ $xyzzy
xyzzy: Undefined variable.

[pax ~]$ $xyzzy >>&log
xyzzy: Undefined variable.

[pax ~]$ cat log
cat: log: No such file or directory

The reason for this is that the current shell is complaining about trying to evaluate $xyzzy. This makes sense. With the command:

someCmd $HOME

the someCmd executable will never see the literal $HOME, it's actually replaced with the value. And that replacement is done by the shell before someCmd is even set up (including having its standard input or output streams modified).




回答2:


You cannot perform file descriptor manipulation and the mantra that Csh Programming is considered harmful has been echoed for the past 20 years.

There are a lot of alternative shells available and even /bin/sh is a better option to program scripts than tcsh/csh. I would hope after all this time nobody is forcing you to use csh.



来源:https://stackoverflow.com/questions/9426440/stderr-redirection-methods

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!