首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >stderr重定向方法

stderr重定向方法
EN

Stack Overflow用户
提问于 2012-02-24 14:35:18
回答 2查看 382关注 0票数 0

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

终端日志如下:

代码语言:javascript
复制
>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

我需要确认我是否可以使用下面这样的东西来满足我的要求

代码语言:javascript
复制
>csh ./script_name | tee -a log

在我的例子中,它只将stdout定向到日志文件并阻塞stderr。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-02-24 14:42:16

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

如果您在第二次尝试之前删除了log文件,则可以看到echo实际上根本没有写入该文件,这似乎支持了这一点:

代码语言:javascript
复制
[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执行重定向,您将获得所需的结果:

代码语言:javascript
复制
[pax ~]$ ( echo $a b c ) >> & log

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

事实上,您甚至不需要使用有效的命令就可以看到这一点:

代码语言:javascript
复制
[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。这是有道理的。使用以下命令:

代码语言:javascript
复制
someCmd $HOME

someCmd可执行文件永远不会看到文字$HOME,它实际上被替换为值。甚至在设置someCmd (包括修改其标准输入流或输出流)之前,shell就已经完成了替换。

票数 1
EN

Stack Overflow用户

发布于 2012-02-24 14:49:35

您不能执行文件描述符操作,也不能执行Csh Programming is considered harmful在过去20年中一直沿用的咒语。

有很多可供选择的shell,甚至/bin/sh也是比tcsh/csh更好的脚本编程选项。我希望过了这么久,没有人强迫你使用csh。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9426440

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档