将stderrredirect到c shell中的stdout
当我在csh中运行下面的命令时,我什么都没有,但是它在bash中有效,在csh中是否有任何等价物可以将标准错误redirect到标准输出?
xxx 2>&1
注意:xxx是一个无效的命令,我只是想让错误看到输出。
csh
shell从来不知道其在redirect过程中操作文件句柄的广泛能力。
您可以使用以下命令将标准输出和错误redirect到文件:
xxx >& filename
但那不像你以前那样,将标准错误redirect到当前的标准输出。
但是,如果您的底层操作系统暴露了文件系统中进程的标准输出(如Linux对/dev/stdout
所做的那样),则可以按如下所示使用该方法:
xxx >& /dev/stdout
这将强制标准输出和标准错误到达当前标准输出的相同位置,实际上您使用bash
redirect的方式2>&1
。
请记住,这不是一个csh
function。 如果您在不将标准输出作为文件公开的操作系统上运行,则不能使用此方法。
不过,还有另一种方法。 你可以把两个stream合并成一个,如果你用|&
将它发送到pipe道 ,那么你所需要做的就是find一个pipe道组件,它把标准input写到它的标准输出中。 如果你不知道这样的事情,那么如果你不给出任何论点, cat
就是这样做的。 因此,您可以在以下情况下达到您的目的:
xxx |& cat
当然,也没有任何东西阻止你在 csh
脚本中运行bash
(假设它在系统上)来给你增加的function。 然后,您可以使用该shell的丰富redirect来处理csh
可能会遇到的更复杂的情况。
我们来更详细地探讨一下。 首先,创build一个可执行的echo_err
,它将向stderr
写入一个string:
#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和ps
的echo
是简单的,所以你可以确保它的csh
运行这个脚本。 当你运行这个脚本:
./test.csh >test.out 2>test.err
( 在 csh
开始运行脚本之前 ,最初的redirect是由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
给了你redirect的全部权力。
bash
命令中的2>&1
很容易让您将标准错误redirect到当前标准输出(根据需要),而无需预先知道标准输出当前的位置。
我反对上面的答案,并提供我自己的答案。 csh
是否有这个function,这是如何完成的:
xxx |& some_exec # will pipe merged output to your some_exec
要么
xxx |& cat > filename
或者如果你只是想要它合并stream(到标准输出),而不是redirect到一个文件或some_exec:
xxx |& tee /dev/null
正如paxdiablo所说,你可以用>&
来redirectstdout和stderr。 但是,如果你想让它们分开,你可以使用下面的代码:
(command > stdoutfile) >& stderrfile
…如上所述,将stdoutredirect到stdoutfile和stderr stderrfile。
那怎么样
xxx >& /dev/stdout
???
xxx >& filename
或者这样做,以查看屏幕上的所有内容,并将其转到您的文件:
xxx | & tee ./logfile
我认为这是csh的正确答案。
xxx >/dev/stderr
注意大多数csh在现代环境中确实是tcsh:
rmockler> ls -latr /usr/bin/csh
lrwxrwxrwx 1 root root 9 2011-05-03 13:40 / usr / bin / csh – > / bin / tcsh
使用反引号embedded语句描述如下:
echo "`echo 'standard out1'` `echo 'error out1' >/dev/stderr` `echo 'standard out2'`" | tee -a /tmp/test.txt ; cat /tmp/test.txt
如果这对你有用,请碰到1.其他build议不适用于我的csh环境。