当我在csh
中运行以下命令时,什么都没有输出,但是在bash
中可以正常工作。
在csh
中是否有相应的命令可以将标准错误重定向到标准输出?
somecommand 2>&1
当我在csh
中运行以下命令时,什么都没有输出,但是在bash
中可以正常工作。
在csh
中是否有相应的命令可以将标准错误重定向到标准输出?
somecommand 2>&1
csh
shell一直以来都不因在重定向过程中能够广泛处理文件句柄而闻名。
您可以使用以下命令将标准输出和错误输出同时重定向到一个文件中:
xxx >& filename
但这并不是你想要的,将标准错误重定向到当前标准输出。
然而,如果你所使用的操作系统在文件系统中暴露了进程的标准输出(正如Linux使用/dev/stdout
),你可以按照以下方式使用该方法:
xxx >& /dev/stdout
这将强制标准输出和标准错误输出到与当前标准输出相同的位置,有效地实现了您在bash
重定向中使用的2>&1
。
但请记住,这不是的功能。如果您运行的操作系统未公开标准输出作为文件,则无法使用此方法。
然而,还有另一种方法。如果将两个流合并为一个,并使用|&
将其发送到管道中,那么您只需要找到一个管道组件,该组件将其标准输入写入其标准输出即可。如果您不知道这样的东西,那么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"
使用 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
让您很容易地将标准错误重定向到当前的 标准输出(按需求),无需事先知道标准输出的位置。
tee
是正确的工具。通过tee
将数据同时发送到标准输出和/dev/null
与通过cat
仅发送到标准输出没有任何区别。所以我用那个选项更新了它,但是感谢您的信息,它帮了我很大的忙。 - paxdiablo我反对上面的答案,并提供自己的观点。 csh
确实具有此功能,以下是如何实现:
xxx |& some_exec # will pipe merged output to your some_exec
或者xxx |& cat > filename
或者,如果你只想合并流到stdout而不是重定向到文件或某些执行:
xxx |& tee /dev/null
bash
shell 的欺骗方法,否则无法使用 csh
来完成OP所要求的操作。 - paxdiablocsh
来说是“最佳”的解决方案。附言:我简直不敢相信,但是通过使用 tee /dev/null
合并标准错误和标准输出的解决方案是“最佳的”。... 摇头 - Trevor Boyd Smith正如paxdiablo所说,您可以使用>&
来重定向标准输出和标准错误输出。但是,如果您想将它们分开,可以使用以下命令:
如上所述。
(command > stdoutfile) >& stderrfile
如上所示,它将标准输出重定向到stdoutfile并将标准错误重定向到stderrfile。
xxx >& filename
或者按照以下步骤,将所有内容显示在屏幕上并保存到文件中:
xxx | & tee ./logfile
pfctl -t bruteforce -T expire 259200 |& tee | grep -v '0/0 addresses expired.'
- muthuhxxx >& /dev/stdout
???
我认为这是关于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
使用嵌入式反引号语句来表示如下:
echo "`echo 'standard out1'` `echo 'error out1' >/dev/stderr` `echo 'standard out2'`" | tee -a /tmp/test.txt ; cat /tmp/test.txt