我在我的机器上运行tcsh/csh shell。最近我意识到我的stderr文件重定向不起作用。
终端日志如下:
>echo b c >>& log
>cat log
b c
>echo $a b c >>& log
a: Undefined variable.
>cat log
b c我从来没有遇到过这样的问题,因此不确定如何调试或排除故障。请多多指教!
另一种重定向方法是使用tee。当我使用>&或>>&时,我完全阻塞了要在终端上显示的任何输出。有没有一种方法可以同时做到这两点,即:对于每个语句
a)将stdout+stderr定向到文件。
b)终端显示stdout+stderr
我需要确认我是否可以使用下面这样的东西来满足我的要求
>csh ./script_name | tee -a log在我的例子中,它只将stdout定向到日志文件并阻塞stderr。
发布于 2012-02-24 14:42:16
我非常确定在为echo子shell设置重定向之前,$a的评估是由当前shell完成的?
如果您在第二次尝试之前删除了log文件,则可以看到echo实际上根本没有写入该文件,这似乎支持了这一点:
[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还有一个事实是,如果您在显式的子subshell中运行echo,并且为子subshell而不是echo执行重定向,您将获得所需的结果:
[pax ~]$ ( echo $a b c ) >> & log
[pax ~]$ cat log
b c
a: Undefined variable.事实上,您甚至不需要使用有效的命令就可以看到这一点:
[pax ~]$ rm log
[pax ~]$ $xyzzy
xyzzy: Undefined variable.
[pax ~]$ $xyzzy >>&log
xyzzy: Undefined variable.
[pax ~]$ cat log
cat: log: No such file or directory这样做的原因是当前的外壳程序正在抱怨试图评估$xyzzy。这是有道理的。使用以下命令:
someCmd $HOMEsomeCmd可执行文件永远不会看到文字$HOME,它实际上被替换为值。甚至在设置someCmd (包括修改其标准输入流或输出流)之前,shell就已经完成了替换。
发布于 2012-02-24 14:49:35
您不能执行文件描述符操作,也不能执行Csh Programming is considered harmful在过去20年中一直沿用的咒语。
有很多可供选择的shell,甚至/bin/sh也是比tcsh/csh更好的脚本编程选项。我希望过了这么久,没有人强迫你使用csh。
https://stackoverflow.com/questions/9426440
复制相似问题