csh shell 从未因其在重定向过程中操纵文件句柄的广泛能力而闻名。
您可以将标准输出和错误重定向到一个文件:
xxx >& filename
但这并不是你所追求的,将标准错误重定向到 current 标准输出。
但是,如果您的底层操作系统在文件系统中公开了进程的标准输出(就像 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 的echo 和ps 很简单,因此您可以确保它是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 重定向功能。
bash 命令中的2>&1 很容易让您将标准错误重定向到当前 标准输出(根据需要),而无需事先知道标准输出当前的去向。