2013-09-27 46 views
0

這裏就是我想要做的事:嘗試使用的變量在bash重定向標準錯誤到/ dev/null的

[[ "${1}" == "debug" ]] && DEBUG='2>/dev/null' || DEBUG='' 

{ 
    echo "a b c" 
    echo "d e f" >&2 
} ${DEBUG} 

這並不是因爲「SH工作:靠近意外的標記語法錯誤`$ {BLAH}'」。我可以做類似的事情,像這樣:

eval echo "def" ${DEBUG} 

但我不能用一大塊代碼做到這一點。另一種可能是使用「EXEC」做在線重定向與我的代碼的其餘部分,如:

[[ "${1}" == "debug" ]] && exec 2>/dev/null 

但我的殼掛着如果我嘗試在特定的方式使用EXEC。任何想法,切肉刀的朋友?

回答

0

創建另一個FD:

[[ "${1}" == "debug" ]] && exec 7>/dev/null || exec 7>&2 

{ 
    echo "a b c" 
    echo "d e f" >&7 
} 

順便說一下你確定當提到debug參數輸出應該廢止,或其他周圍呢?

實際上是一個更好的方法是創建一個功能:

if [[ "${1}" == "debug" ]]; then 
    function debug { 
     echo "$1" >&2 
    } 
else 
    function debug { 
     : 
    } 
fi 

{ 
    echo "a b c" 
    debug "d e f" 
} 
0

在腳本中,

[[ $1 != debug ]] && exec 2>/dev/null 

實際上是你在找什麼。但是你可能不想在交互式shell中執行它。

Bash使用stderr來做一些非常重要的事情,而不僅僅是提醒你錯誤條件。首先,它使用stderr來打印命令提示符,並且(通常)回顯您鍵入的字符,以便您可以看到它們。

所以當你在一個交互式shell中使用exec 2>/dev/null時,bash會繼續工作,它甚至會繼續聽你的聲音,但它不能再響應。所以它看起來像它的「懸掛」,但這只是一種幻覺。嘗試輸入Echo hello, me(不能看到你輸入的內容),當你輸入時,你會看到回聲的結果,就像正常一樣。

順便說一句,你試圖去做什麼?抑制/dev/stderr幾乎是不對的......

+0

它甚至發生在不同的_fd_而不是'2>'和不同的shell如_Bourne Shel_l('sh') 如果您選擇任何其他數字,結果是同樣的:「失去外殼互動」。 – xsubira

相關問題