stderr 重定向在 csh 中不起作用

stderr 重定向在 csh 中不起作用

我运行以下命令:

pkg_add emacs-23.4,2.tbz 2> output.log

输出仍然显示在终端中。当我按下 时,我得到

pkg_add emacs-23.4,2.tbz 2 > output.log

前面有一个空格2

我最初没有放这个。我尝试

pkg_add emacs-23.4,2.tbz > output.log 2>&1

再次,当我按下 时已添加空格

为什么这种事会发生在我身上?

我在 FreeBSD 上运行 csh。

答案1

我不确定您是否试图隐藏 STDERR 或将其重定向到 STDOUT。

要将 STDOUT 重定向到文件:

pkg_add emacs-23.4,2.tbz > stdout.log

要将 STDOUT 和 STDERR 重定向到文件:

pkg_add emacs-23.4,2.tbz > & stdxxx.log

要将 STDOUT 重定向到文件并隐藏 STDERR:

( pkg_add emacs-23.4,2.tbz > stdout.log ) > & /dev/null

将 STDOUT 重定向到控制台并隐藏 STDERR:

( pkg_add emacs-23.4,2.tbz > /dev/tty ) > & /dev/null

将 STDOUT 重定向到控制台并将 STDERR 重定向到文件:

( pkg_add emacs-23.4,2.tbz > /dev/tty ) > & stderr.log

将 STDOUT 重定向到文件并将 STDERR 重定向到文件:

( pkg_add emacs-23.4,2.tbz > stdout.log ) > & stderr.log

编辑:这样做的原因是 () 中的操作首先发生;因此,如果我们重定向了 STDOUT,那么它在 () 之外将不再可用。这给我们留下了 STDERR,然后我们可以根据需要重定向它。

答案2

2> 重定向不适用于 csh 或 tcsh。

使用该chsh命令将 shell 更改为 /bin/sh 或 /usr/local/bin/bash 以便使用样式2>重定向。笔记:不要将 root 的 shell 更改为 /usr/local/bin/bash

csh 和 tcsh 无法单独重定向标准输出和错误,但>&会将组合输出重定向到文件。

答案3

我知道如何在 Csh 中执行此操作,但使用 2 个 shell:

csh -c 'SOME_COMMAND 1>/dev/null' |& tee file.txt

这种方式允许重定向仅有的stderr 到 file.txt,没有 stdout - 这就是你想要的。

答案4

关于 nikc 的答案,要实现 Bourne shell 的相同行为,请/dev/tty使用 FIFO。

将 STDOUT 重定向到控制台并隐藏 STDERR:

mkfifo stdout
( pkg install -y emacs > stdout ) >& /dev/null & cat stdout

要将 STDERR 重定向到控制台并隐藏 STDOUT:

pkg install -y emacs > /dev/null

相关内容