io-redirection - 在 C shell 中将 stderr 重定向到 stdout

标签 io-redirection csh

当我在 csh 中运行以下命令时,我什么也没得到,但它在 bash 中有效。 csh 中是否有任何等效项可以将标准错误重定向到标准输出?

somecommand 2>&1

最佳答案

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

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

xxx >& filename

但这并不完全是您想要的,将标准错误重定向到当前标准输出。

<小时/>

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

xxx >& /dev/stdout

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

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

<小时/>

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

xxx |& cat
<小时/>

当然,也没有什么可以阻止您在 csh 脚本中运行 bash(假设它位于系统上的某个位置)增加的功能。然后,您可以使用该 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

(初始重定向是在 csh 开始运行脚本之前由 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 可以为您提供重定向的全部 bash 功能。

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

关于io-redirection - 在 C shell 中将 stderr 重定向到 stdout,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13720246/

相关文章:

linux - 将参数从 csh 传递给程序,完全按原样传递

shell - 在命令所在的同一行设置变量

mysql - 从命令行 Mysql 创建表时出现问题

窗口命令 : why does the order in which you specify output redirection matter?

c++ - 文件重定向到程序

bash - 关于命名管道、grep 和文件重定向的重定向行为

bash exec 将输出发送到管道,怎么样?

shell - 在 csh 中使用列表设置环境变量

linux - 为什么重定向 + 管道 ( 2>&1 |) 合并两个流而不是将 stderr 移动到 stdout?

linux - 我在 SunOS 中的 shell 脚本有什么问题,在其他 Linux 版本上运行良好