【问题标题】:stderr redirection methods标准错误重定向方法
【发布时间】:2012-02-24 06:35:18
【问题描述】:

我正在我的机器上运行 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。 当我使用 >& 或 >>& 时,我完全阻止了要在终端上显示的任何输出。 有没有办法两者都可以,那就是:for each statement

a) 将 stdout+stderr 定向到文件。

b) 在终端显示 stdout+stderr

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

>csh ./script_name | tee -a log

在我的情况下,它只将标准输出定向到日志文件并阻止标准错误。

【问题讨论】:

    标签: file redirect stderr csh tcsh


    【解决方案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
    

    原因是当前的 shell 抱怨试图评估 $xyzzy。这是有道理的。使用命令:

    someCmd $HOME
    

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

    【讨论】:

    • 我不知道如何检查。据我了解,即使对 $a 进行了解释,它也不应该停止执行,而是应该将 stdout+stderr 引导到日志文件。
    • @Ani,你可以像我一样检查它,通过强制重定向首先发生然后进行扩展,例如( echo $a ) >>&log。我已经更详细地更新了答案。
    • 感谢您的回复,这让我更清楚语句是如何执行的。
    【解决方案2】:

    您无法执行文件描述符操作,而 Csh Programming is considered harmful 过去 20 年来一直在呼应的口头禅。

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

    【讨论】:

    • 你说得对,但我不确定这与手头的问题有什么关系。我发现某些大型无名公司的编译器根据 ISO 标准是不够的,但是,当我被问到关于它们的问题时,我不会抱怨提问者应该如何切换到 gcc :-) 你不会调试未成年人通过更改和重新学习所有工具来解决此类问题。
    • @paxdiablo 这个人问为什么我不能将 stderr 重定向到文件,我的回答是你不能。 CSH 不支持。这与您提出的错误论点相去甚远。完全不相关。
    • 我认为您误解了这个问题。 OP 没有提及重定向 only 标准输出,否则他们不会使用>>&。如果是这种情况,那么您的答案将很有用。 问题 是重定向没有足够快地启动以捕获“未定义变量”消息,这是由于外壳程序正在执行扩展。解决方案是显式地对其进行子外壳,将重定向应用到外壳而不是 echo,因为错误而永远不会运行。
    • @paxdiablo 我没有误解任何内容。 “最近我意识到我的 stderr 文件重定向不起作用”......它从未在 csh 中工作过。表明完全缺乏 csh 可以支持他们认为可以支持的知识。
    • @tawman 感谢您的回复。但不幸的是,我没有选择切换到 csh 的选项。但我非常感谢您的意见。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-22
    • 2011-10-11
    • 2012-03-30
    • 2012-05-26
    • 2019-11-08
    • 2011-10-11
    相关资源
    最近更新 更多