題 在tcsh中將stdout重定向到stderr


從我的理解,以下應發送'test'關於tcsh中的標準錯誤:

echo test >&2

然而,它反而寫'test'到一個名為的文件 2當我查看我的歷史時,我發現實際執行的是

echo test > & 2

我不確定哪個層插入這些空格,但我可以以某種方式阻止它嗎?如果沒有,我想我總是可以使用 > /dev/stderr 代替。


4
2018-05-23 14:28


起源


echo test >&2 打印到stderr。至少在我的bash中。 - Der Hochstapler
順便說一句,使用 > 作為shell指示器在當前上下文中的代碼片段中非常混亂;) - Der Hochstapler
我首先假設bash,但它標記為tsch。 - Dave Forgac
對此感到抱歉,希望我的問題現在更清楚了。如果我可以在這裡使用bash,我會,因為它對我有用。 - Nate Parsons
你能引用重定向嗎? echo test '>&2'?不知道這是否有效,並且沒有tcsh來嘗試它。 - kevlar1818


答案:


關於 csh來自 http://www.faqs.org/faqs/unix-faq/shell/csh-whynot/

沿著這些相同的行,您不能將csh腳本中的錯誤消息指向stderr,因為這被認為是正確的。在Bourne shell中,您可能會說:

echo "$0: cannot find $file" 1>&2

但是在csh中,你無法將stdout重定向到stderr,所以你最終會做一些像這樣的傻事:

sh -c 'echo "$0: cannot find $file" 1>&2'

我做了一些快速嘗試 tcsh,並且懷疑它似乎也是如此(tcsh 應該完全兼容 csh)。


解決你提出的問題:沒關係 如果 你可以做 tcsh 不是“插入空格”,因為它無論如何都不會以預期的方式解釋該序列。


5
2018-05-24 09:29





編輯:

我沒有看到這是tsch。請參閱的“輸入/輸出”部分 man tsch 詳情包括:

可以通過具有標準的管道引導診斷輸出   輸出。只需使用形式|而不僅僅是|。

shell目前還不能重定向診斷輸出   重定向標準輸出,但是(command> output-file)>&error-file   通常是一種可接受的解決方法。輸出文件或錯誤文件   可以是/ dev / tty向終端發送輸出。


5
2018-05-23 14:34



謝謝你指出了這一點,但我不確定它是否適用。我不想重定向進程的診斷輸出(stderr?),而是希望正常輸出出現在stdout上。 - Nate Parsons
@drhorrible:這基本上是一回事。你正在做的是開始 echo 處理並將其輸出重定向到stderr。因此,有效地打印到stderr :) - Der Hochstapler
這不是它的工作方式。 (echo test > out) >& err 將'test'寫入一個名為'out'的文件,並在我的機器上創建一個空文件'err',至少。 - Nate Parsons
這是一個很好的方法 STDOUT 和 STDERR 從命令發送輸出到兩者,並將它們發送到文件。 然而它確實如此 不 回答OP關於如何強迫的問題 STDOUT (這是echo發送輸出的地方)去 STDERR 在tcsh。 - Randall


Daniel Andersson的解決方案非常棒,如果你想運行的命令可以從sh運行(因此,子shell,它將無法更改目錄或修改當前shell的環境),它將運行良好。如果要將stdout轉換為stderr但將命令執行保留在當前shell中,則可以僅將bash用於stdout-to-stderr重定向,如下所示:

echo“錯誤信息”| bash -c“cat - 1>&2”


3
2018-04-30 20:17





我做了一些實驗,在tcsh腳本中指向/ dev / stderr。我的 意圖是腳本的用戶能夠(也在tcsh中)直接 標準輸出和標準錯誤到不同的地方。我發現了 腳本必須看起來像:

echo 1abc
echo 1ABC >>& /dev/stderr
echo 2abc
echo 2ABC >>& /dev/stderr

如果您不使用>>,那麼在重定向的腳本輸出中,您將丟失 一些標準輸入和/或標準輸出數據。即便如此,重定向 使用簡單的>&do將腳本輸出到文件  工作;它也 丟失部分標準錯誤(即使在bash上)。您 必須 用一個

(SCRIPT >! file.out ) >&! file.err

構造。這裡任一文件或兩者都可以是/ dev / tty輸出到屏幕。 (如果不重定向腳本輸出,則永遠不會出現問題。)

請注意,如果直接指向標準錯誤,則不會出現這種奇怪現象 在一個程序內。

另請注意,這是在Linux上(準確地說是Ubuntu-MATE LTS 16.04)。當然,至少需要/ dev / stderr才能使用以上內容。

發布後,我發現了另一個問題。如果在1ABC行之後放置一個寫入標準錯誤的程序,那麼1ABC就會丟失 將標準錯誤直接發送到文件。好消息是,在我的情況下,標準 錯誤必須繼續轉到/ dev / tty。嘖嘖。 :)

為了便於修改,以及沒有/ dev / stderr的系統,我決定通過以下兩個標題行實現這一點

alias stderr echo ; if (-ew /dev/stderr) alias stderr 'echo \!* >> /dev/stderr'
which echo_err > /dev/null ; if !($status) alias stderr echo_err

這允許用戶放置一個sh腳本echo_err,

#!/bin/sh
echo $* 1>&2

在路徑中,如果確實需要無錯誤的標準錯誤重定向(在 兩次圖像激活的費用)。

另外一個補充:我上面的帖子是關於重定向到/ dev / stderr的問題 在tcsh內。但只要我給別名,也許我也應該給 一個用於Glen Ragan的解決方案,如果你不介意的話,這真的很不錯 圖像激活。限定

alias 1to2 '\!* | sh -c "cat 1>&2"'
alias 2to1 '\!* |& cat'

然後,您可以在任何要將標準輸出重定向到stdout的命令之前加1到2。這就像在其他shell(包括DOS)中的1>&2命令之前一樣。它並不是Linux中的錯誤。那麼也可以有2to1。 :)

OOPS:上述1to2中的一個小缺陷:如果命令同時寫入標準輸出和標準錯誤,則順序錯誤。命令的標準錯誤內容在最終標準錯誤結果中的標準輸出內容之前結束。解決方案很簡單;改變|進入|&:

alias 1to2 '\!* |& sh -c "cat 1>&2"'

對於那個很抱歉。


1
2018-03-01 18:02