2012-02-24 122 views
0

我在我的机器上运行tcsh/csh shell。最近我意识到我的stderr文件重定向不起作用。stderr重定向方法

请找到终端记录如下:

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

我从来没有遇到这样的问题,因此不知道如何调试或排除故障。 请指教!

改变方向的重定向是使用三通。 当我使用> &或>> &,我完全阻止任何输出显示在终端上。 有没有一种方法可以同时做到这一点,即:对于每个语句

a)将stdout + stderr指向文件。

B)显示标准输出+标准错误的终端

我需要确认,如果我可以用这样的(如下图),以满足我的要求

>csh ./script_name | tee -a log 

在我的情况下,它仅会指示标准输出记录文件并阻止stderr。

回答

1

我敢肯定的是$a评估是由当前的shell完成,之前重定向设置为echo子shell?

这似乎是一个事实,即echo没有实际写入文件可言,你可以看到,如果你第二次尝试之前删除的文件log支持:

[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 

并且还通过这样的事实是,如果你在与子shell完成的,而不是echo重定向一个明确的子shell中运行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 $HOME 

someCmd可执行文件将永远看字面$HOME,它实际上与值替换。在someCmd甚至设置(包括修改其标准输入或输出流)之前,该替换是由shell完成的。

+0

我不知道如何检查。 从我所了解的情况来看,即使解释是为$ a完成的,它也不应该停止执行,而应该指示stdout + stderr来记录文件。 – Ani 2012-02-24 06:47:01

+0

@Ani,你可以像我一样,通过强制重定向首先发生_then_进行扩展,la'(echo $ a)>>&log'来检查它。我已经更详细地更新了答案。 – paxdiablo 2012-02-24 07:05:50

+0

感谢您的回复,这让我更清楚地知道如何执行语句。 – Ani 2012-02-24 07:31:32

0

您不能执行文件描述符操作和Csh Programming is considered harmful已在过去20年中得到回应的口头禅。

有很多可用的shell可用,甚至/ bin/sh是比tcsh/csh编程脚本更好的选项。我希望毕竟没有人强迫你使用csh。

+0

您可以倒票,但csh不能2>&1 – tawman 2012-02-24 06:59:55

+0

您说得对,但我不确定到底是怎么回事。我发现某些大型无名公司的编译器按照ISO标准是不够的,但是当我被问到一个关于它们的问题时,我不会大声说出提问者应该如何切换到gcc :-)你不会调试一个未成年人通过更改和重新学习所有工具来解决这个问题。 – paxdiablo 2012-02-24 07:03:09

+0

@paxdiablo该人问为什么我不能将stderr重定向到该文件,我的答案是你不能。 CSH不支持它。这与你所建议的错误观点相去甚远。完全不相关。 – tawman 2012-02-24 07:05:53