当我在 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 的 echo
和 ps
只是为了确保它是 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/