将stderr重定向到C shell中的stdout

zdd*_*zdd 60 csh io-redirection

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

somecommand 2>&1
Run Code Online (Sandbox Code Playgroud)

pax*_*blo 79

csh外壳从未以其丰富的操作文件句柄的重定向过程的能力.

您可以将标准输出和错误重定向到文件:

xxx >& filename
Run Code Online (Sandbox Code Playgroud)

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


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

xxx >& /dev/stdout
Run Code Online (Sandbox Code Playgroud)

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

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


但是,还有另一种方法.您可以将两个流合并成一个,如果你把它发送到管道|&,那么所有你需要做的就是找到它的标准输入写入到标准输出管道组件.如果你不知道这样的事情,cat如果你不给它任何参数那就是这样.因此,您可以在以下特定情况下实现目标:

xxx |& cat
Run Code Online (Sandbox Code Playgroud)

当然,也没有从运行阻止你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;
}
Run Code Online (Sandbox Code Playgroud)

然后是一个控件脚本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"
Run Code Online (Sandbox Code Playgroud)

echo该PID的和ps仅仅这样可以保证它的csh运行此脚本.使用以下命令运行此脚本时:

./test.csh >test.out 2>test.err
Run Code Online (Sandbox Code Playgroud)

(初始重定向是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)
Run Code Online (Sandbox Code Playgroud)

你可以看到有该test.csh过程在C shell中运行,并且呼吁bash从内部还有为您提供了完整的bash重定向的力量.

2>&1bash命令很容易让你重定向标准错误到当前标准输出(如需要),而不在那里标准输出目前正的先验知识.


bio*_*ffe 42

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

xxx |& some_exec # will pipe merged output to your some_exec 
Run Code Online (Sandbox Code Playgroud)

要么

xxx |& cat > filename
Run Code Online (Sandbox Code Playgroud)

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

xxx |& tee /dev/null
Run Code Online (Sandbox Code Playgroud)

  • 虽然csh中没有完全等效的方法,但是您的答案仅涉及要将stdout和stderr都重定向到文件中的用例。此答案还演示了如何将它们重定向到管道中。 (2认同)

Chr*_*ris 38

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

(command > stdoutfile) >& stderrfile
Run Code Online (Sandbox Code Playgroud)

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


小智 5

   xxx >& filename
Run Code Online (Sandbox Code Playgroud)

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

  xxx | & tee ./logfile
Run Code Online (Sandbox Code Playgroud)