2013-01-22 79 views
2

bash支持顏色,即\033[31m切換到紅色和\033[0m切換回無色。bash包裝顏色stderr紅色

我想作一個小的bash,包裝,可靠地推出標準錯誤爲紅色,即是來自於標準錯誤之後的所有內容應該把\033[31m之前和\033[0m

我不確定這是甚至可能的,因爲當兩個並行進程(或甚至一個進程)寫入stdout和stderr時,必須有一種方法來區分兩個字符,字符基礎。

+3

擊不 「支持」 ANSI轉義序列,你的終端模擬器會。 – jordanm

回答

1

着色文本足夠簡單:讀取每一行並在開始和結束時使用適當的轉義序列對其進行回顯。但着色標準錯誤變得棘手,因爲標準錯誤不會傳遞給管道。

以下是一種通過交換標準錯誤和標準輸出,然後過濾標準輸出的方法。

下面是我們的測試命令:

#!/bin/bash 

echo hi 
echo 'Error!' 1>&2 

而且wrapper腳本:

#!/bin/bash 
(# swap stderr and stdout 
exec 3>&1 # copy stdout to fd 3 
exec 1>&2 # copy stderr to fd 1 
exec 2>&3- # move saved stdout on fd 3 over to 2 
"${@}") | while read line; do 
       echo -e "\033[31m${line}\033[0m" 
      done 

然後:

$ ./wrapper ./test-command 
hi 
Error! # <- shows up red 

不幸的是,從包裝命令所有輸出出來的stderr ,而不是stdout,所以你不能管輸出我nto任何進一步的腳本。你可以通過creating a temporary fifo來解決這個問題......但是希望這個小包裝腳本足以滿足你的需求。

1

基於andrewdotn的包裝

變化:

  • 提出的標準錯誤輸出反饋到stderr
  • 避免在線路echo -e處理內容

包裝

#!/bin/bash 

"${@}" 2> >(
while read line; do 
    echo -ne "\033[31m" 1>&2 
    echo -n "${line}" 1>&2 
    echo -e "\033[0m" 1>&2 
done 
) 

問題: 輸出線結束分組,而不是混合的stdout/stderr的

測試腳本:

#!/bin/bash 

echo Hi 
echo "\033[32mStuff" 
echo message 
echo error 1>&2 
echo message 
echo error 1>&2 
echo message 
echo error 1>&2 

輸出:

Hi 
\033[32mStuff 
message 
message 
message 
error # <- shows up red 
error # <- shows up red 
error # <- shows up red 
相關問題