将stderrredirect到c shell中的stdout

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

xxx 2>&1 

注意:xxx是一个无效的命令,我只是想让错误看到输出。

csh shell从来不知道其在redirect过程中操作文件句柄的广泛能力。

您可以使用以下命令将标准输出和错误redirect到文件:

 xxx >& filename 

但那不像你以前那样,将标准错误redirect到当前的标准输出。


但是,如果您的底层操作系统暴露了文件系统中进程的标准输出(如Linux对/dev/stdout所做的那样),则可以按如下所示使用该方法:

 xxx >& /dev/stdout 

这将强制标准输出标准错误到达当前标准输出的相同位置,实际上您使用bashredirect的方式2>&1

请记住,这不是一个cshfunction。 如果您在将标准输出作为文件公开的操作系统上运行,则不能使用此方法。


不过,还有另一种方法。 你可以把两个stream合并成一个,如果你用|&将它发送到pipe道 ,那么你所需要做的就是find一个pipe道组件,它把标准input写到它的标准输出中。 如果你不知道这样的事情,那么如果你不给出任何论点, cat就是这样做的。 因此,您可以在以下情况下达到您的目的:

 xxx |& cat 

当然,也没有任何东西阻止你 csh脚本中运行bash (假设它在系统上)来给你增加的function。 然后,您可以使用该shell的丰富redirect来处理csh可能会遇到的更复杂的情况。

我们来更详细地探讨一下。 首先,创build一个可执行的echo_err ,它将向stderr写入一个string:

 #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和psecho是简单的,所以你可以确保它的csh运行这个脚本。 当你运行这个脚本:

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

csh开始运行脚本之前 ,最初的redirect是由bash设置的),并检查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给了你redirect的全部权力。

bash命令中的2>&1很容易让您将标准错误redirect到当前标准输出(根据需要),而无需预先知道标准输出当前的位置。

我反对上面的答案,并提供我自己的答案。 csh是否有这个function,这是如何完成的:

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

要么

 xxx |& cat > filename 

或者如果你只是想要它合并stream(到标准输出),而不是redirect到一个文件或so​​me_exec:

 xxx |& tee /dev/null 

正如paxdiablo所说,你可以用>&来redirectstdout和stderr。 但是,如果你想让它们分开,你可以使用下面的代码:

 (command > stdoutfile) >& stderrfile 

…如上所述,将stdoutredirect到stdoutfile和stderr stderrfile。

那怎么样

 xxx >& /dev/stdout 

???

  xxx >& filename 

或者这样做,以查看屏幕上的所有内容,并将其转到您的文件:

  xxx | & tee ./logfile 

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

 xxx >/dev/stderr 

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

rmockler> ls -latr /usr/bin/csh

lrwxrwxrwx 1 root root 9 2011-05-03 13:40 / usr / bin / csh – > / bin / tcsh

使用反引号embedded语句描述如下:

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

如果这对你有用,请碰到1.其他build议不适用于我的csh环境。