69

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

somecommand 2>&1
4

6 回答 6

91

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

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

xxx >& filename

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


但是,如果您的底层操作系统在文件系统中公开了进程的标准输出(就像 Linux 对/dev/stdout.

xxx >& /dev/stdout

这将强制标准输出标准错误都到与当前标准输出相同的位置,有效地与bash重定向一样,2>&1.

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


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

xxx |& cat

当然,也没有什么可以阻止您脚本中运行bash(假设它在系统上的某个地方)以提供附加功能。然后,您可以使用该 shell 的丰富重定向来处理可能难以解决的更复杂的情况。cshcsh

让我们更详细地探讨一下。首先,创建一个可执行文件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"

echoPID 的 和很ps简单,因此您可以确保它csh正在运行此脚本。当您使用以下命令运行此脚本时:

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

(初始重定向是在开始运行脚本bash 之前 设置的),然后检查文件,您会看到:cshout/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进程正在bashC shell 中运行,并且从那里调用为您提供bash了重定向的全部功能。

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

于 2012-12-05T09:49:09.117 回答
43

我反对上述答案并提供我自己的答案。csh确实有这种能力,它是如何完成的:

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

或者

xxx |& cat > filename

或者,如果您只是希望它合并流(到标准输出)而不是重定向到文件或 some_exec:

xxx |& tee /dev/null
于 2014-01-25T01:04:31.783 回答
39

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

(command > stdoutfile) >& stderrfile

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

于 2014-01-23T16:05:39.417 回答
4
   xxx >& filename

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

  xxx | & tee ./logfile
于 2015-02-27T18:58:52.450 回答
4

刚刚呢

xxx >& /dev/stdout

???

于 2014-11-07T13:24:29.637 回答
-1

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

xxx >/dev/stderr

请注意,大多数 csh 在现代环境中实际上是 tcsh:

摇滚乐>ls -latr /usr/bin/csh

lrwxrwxrwx 1 root root 9 2011-05-03 13:40 /usr/bin/csh -> /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 环境。

于 2014-02-13T16:42:33.730 回答