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

相關內容