将stderr重定向到C shell中的stdout

时间:2012-12-05 09:45:02

标签: io-redirection csh

当我在csh中运行以下命令时,我什么都没有,但是它在bash中有效,csh中有没有可以将标准错误重定向到标准输出的等价物?

somecommand 2>&1

6 个答案:

答案 0 :(得分:73)

csh shell从未因其在重定向过程中操作文件句柄的广泛能力而闻名。

您可以将标准输出和错误重定向到包含以下内容的文件:

xxx >& filename

但这并不是你所追求的,将标准错误重定向到当前标准输出。


但是,如果底层操作系统在文件系统中公开了进程的标准输出(就像Linux使用/dev/stdout那样),则可以按如下方式使用该方法:

xxx >& /dev/stdout

这将强制标准输出标准错误转到与当前标准输出相同的位置,实际上与bash重定向2>&1相同。

请注意,这不是csh功能。如果您在将标准输出作为文件公开的操作系统上运行,则无法使用此方法。


然而,还有另一种方法。如果将两个流发送到带有|&管道,则可以将这两个流组合成一个,然后您需要做的就是找到一个管道组件,将其标准输入写入其标准输出。如果你不知道这样的事情,如果你没有给它任何参数,这正是cat的作用。因此,您可以通过以下方式在特定的案例中实现目标:

xxx |& cat

当然,也没有什么可以阻止你在bash脚本中运行csh(假设它在系统的某个地方)来为你提供额外的功能。然后,您可以使用该shell的丰富重定向来处理csh可能会遇到的更复杂的情况。

让我们更详细地探讨这一点。首先,创建一个可执行文件echo_err,将字符串写入stderr

#include <stdio.h>
int main (int argc, char *argv[]) {
    fprintf (stderr, "stderr (%s)\n", (argc > 1) ? argv[1] : "?");
    return 0;
}

然后是一个控制脚本test.csh,它将在行动中显示它:

#!/usr/bin/csh

ps -ef ; echo ; echo $$ ; echo

echo 'stdout (csh)'
./echo_err csh

bash -c "( echo 'stdout (bash)' ; ./echo_err bash ) 2>&1"

PID的echops只是为了确保它csh运行此脚本。使用以下命令运行此脚本时

./test.csh >test.out 2>test.err

(初始重定向是由bash csh开始运行脚本之前设置的),并检查out/err文件,你看:

test.out:
    UID     PID    PPID  TTY        STIME     COMMAND
    pax    5708    5364  cons0      11:31:14  /usr/bin/ps
    pax    5364    7364  cons0      11:31:13  /usr/bin/tcsh
    pax    7364       1  cons0      10:44:30  /usr/bin/bash

    5364

    stdout (csh)
    stdout (bash)
    stderr (bash)

test.err:
    stderr (csh)

您可以在那里看到test.csh进程 在C shell中运行,并且从那里调用bash为您提供了完整的bash权力重定向。

2>&1命令中的bash非常容易让您将标准错误重定向到当前标准输出(根据需要),而无需事先了解标准输出当前的位置

答案 1 :(得分:42)

我反对上述答案并提供我自己的答案。 csh具备此功能,以下是它的完成方式:

xxx |& some_exec # will pipe merged output to your some_exec 

xxx |& cat > filename

或者你只是想让它合并流(到stdout)而不是重定向到文件或so​​me_exec:

xxx |& tee /dev/null

答案 2 :(得分:35)

正如paxdiablo所说,你可以使用>&重定向stdout和stderr。但是,如果您希望它们分开,您可以使用以下内容:

(command > stdoutfile) >& stderrfile

...如上所示,上面将stdout重定向到stdoutfile,stderr重定向到stderrfile。

答案 3 :(得分:4)

怎么样只是

xxx >& /dev/stdout

???

答案 4 :(得分:4)

   xxx >& filename

或者执行此操作以查看屏幕上的所有内容并将其转到您的文件中:

  xxx | & tee ./logfile

答案 5 :(得分:-1)

我认为这是csh的正确答案。

xxx >/dev/stderr

注意大多数csh在现代环境中都是tcsh:

rmockler&GT; ls -latr /usr/bin/csh

lrwxrwxrwx 1 root root 9 2011-05-03 13:40 / usr / bin / csh - &gt; / bin中/ tcsh的

使用反引号嵌入语句来描述如下:

echo "`echo 'standard out1'` `echo 'error out1' >/dev/stderr` `echo 'standard out2'`" | tee -a /tmp/test.txt ; cat /tmp/test.txt

如果这对您有用,请提高到1.其他建议不适用于我的csh环境。