当我在 中运行以下命令时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
.
请记住,这不是一项csh
功能。如果您在不将标准输出公开为文件的操作系统上运行,则不能使用此方法。
但是,还有另一种方法。如果使用 将两个流发送到管道,则可以将其合并为一个|&
,然后您需要做的就是找到一个将其标准输入写入其标准输出的管道组件。万一你不知道这样的事情,cat
如果你不给它任何论据,那正是这样做的。因此,在这种特定情况下,您可以通过以下方式实现您的目标:
xxx |& cat
当然,也没有什么可以阻止您在脚本中运行bash
(假设它在系统上的某个地方)以提供附加功能。然后,您可以使用该 shell 的丰富重定向来处理可能难以解决的更复杂的情况。csh
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
PID 的 和很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
进程正在bash
C shell 中运行,并且从那里调用为您提供bash
了重定向的全部功能。
2>&1
命令中的很bash
容易让您将标准错误重定向到当前标准输出(根据需要),而无需事先知道标准输出当前的去向。
我反对上述答案并提供我自己的答案。csh
确实有这种能力,它是如何完成的:
xxx |& some_exec # will pipe merged output to your some_exec
或者
xxx |& cat > filename
或者,如果您只是希望它合并流(到标准输出)而不是重定向到文件或 some_exec:
xxx |& tee /dev/null
正如paxdiablo所说,您可以使用>&
重定向stdout和stderr。但是,如果您希望它们分开,您可以使用以下内容:
(command > stdoutfile) >& stderrfile
...如上所示,将 stdout 重定向到 stdoutfile 并将 stderr 重定向到 stderrfile。
xxx >& filename
或者这样做以查看屏幕上的所有内容并将其转到您的文件中:
xxx | & tee ./logfile
刚刚呢
xxx >& /dev/stdout
???
我认为这是 csh 的正确答案。
xxx >/dev/stderr
请注意,大多数 csh 在现代环境中实际上是 tcsh:
摇滚乐>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
如果这对您有用,请提高到 1。其他建议不适用于我的 csh 环境。