当我在csh
中运行以下命令时,我什么都没有,但是它在bash
中有效,csh
中有没有可以将标准错误重定向到标准输出的等价物?
somecommand 2>&1
答案 0 :(得分:73)
csh
shell从未因其在重定向过程中操作文件句柄的广泛能力而闻名。
您可以将标准输出和错误重定向到包含以下内容的文件:
xxx >& filename
但这并不是你所追求的,将标准错误重定向到当前标准输出。
但是,如果底层操作系统在文件系统中公开了进程的标准输出(就像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
权力重定向。
2>&1
命令中的bash
非常容易让您将标准错误重定向到当前标准输出(根据需要),而无需事先了解标准输出当前的位置
答案 1 :(得分:42)
我反对上述答案并提供我自己的答案。 csh
具备此功能,以下是它的完成方式:
xxx |& some_exec # will pipe merged output to your some_exec
或
xxx |& cat > filename
或者你只是想让它合并流(到stdout)而不是重定向到文件或some_exec:
xxx |& tee /dev/null
答案 2 :(得分:35)
正如paxdiablo所说,你可以使用>&
重定向stdout和stderr。但是,如果您希望它们分开,您可以使用以下内容:
(command > stdoutfile) >& stderrfile
...如上所示,上面将stdout重定向到stdoutfile,stderr重定向到stderrfile。
答案 3 :(得分:4)
怎么样只是
xxx >& /dev/stdout
???
答案 4 :(得分:4)
xxx >& filename
或者执行此操作以查看屏幕上的所有内容并将其转到您的文件中:
xxx | & tee ./logfile
答案 5 :(得分:-1)
我认为这是csh的正确答案。
xxx >/dev/stderr
注意大多数csh在现代环境中都是tcsh:
rmockler&GT; ls -latr /usr/bin/csh
lrwxrwxrwx 1 root root 9 2011-05-03 13:40 / usr / bin / csh - &gt; / 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环境。