bash支持顏色,即\033[31m
切換到紅色和\033[0m
切換回無色。bash包裝顏色stderr紅色
我想作一個小的bash,包裝,可靠地推出標準錯誤爲紅色,即是來自於標準錯誤之後的所有內容應該把\033[31m
之前和\033[0m
。
我不確定這是甚至可能的,因爲當兩個並行進程(或甚至一個進程)寫入stdout和stderr時,必須有一種方法來區分兩個字符,字符基礎。
bash支持顏色,即\033[31m
切換到紅色和\033[0m
切換回無色。bash包裝顏色stderr紅色
我想作一個小的bash,包裝,可靠地推出標準錯誤爲紅色,即是來自於標準錯誤之後的所有內容應該把\033[31m
之前和\033[0m
。
我不確定這是甚至可能的,因爲當兩個並行進程(或甚至一個進程)寫入stdout和stderr時,必須有一種方法來區分兩個字符,字符基礎。
着色文本足夠簡單:讀取每一行並在開始和結束時使用適當的轉義序列對其進行回顯。但着色標準錯誤變得棘手,因爲標準錯誤不會傳遞給管道。
以下是一種通過交換標準錯誤和標準輸出,然後過濾標準輸出的方法。
下面是我們的測試命令:
#!/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來解決這個問題......但是希望這個小包裝腳本足以滿足你的需求。
基於andrewdotn的包裝
變化:
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
擊不 「支持」 ANSI轉義序列,你的終端模擬器會。 – jordanm