![](/img/trans.png)
[英]Is it possible to output to and monitor streams other than stdin, stdout & stderr? (python)
[英]Is it possible to make stdout and stderr output be of different colors in XTerm or Konsole?
它甚至可以實現嗎?
我希望命令 stderr 的輸出以與 stdout 不同的顏色呈現(例如,紅色)。
我需要這樣的修改才能在 Linux 上的 Konsole、XTerm 或 GNOME 終端模擬器中使用 Bash shell。
這是一個結合了一些已經提出的好想法的解決方案。
在 bash 腳本中創建一個函數:
color() ( set -o pipefail; "$@" 2>&1>&3 | sed $'s,.*,\e[31m&\e[m,' >&2 ) 3>&1
像這樣使用它:
$ color command -program -args
它將以紅色顯示命令的stderr
。
繼續閱讀以了解其工作原理。 此命令演示了一些有趣的功能。
color()...
— 創建一個名為 color 的 bash 函數。set -o pipefail
— 這是一個 shell 選項,用於保留命令的錯誤返回代碼,該命令的輸出通過管道傳輸到另一個命令。 這是在由括號創建的子外殼中完成的,以免更改外殼中的 pipefail 選項。"$@"
— 將函數的參數作為新命令執行。 "$@"
相當於"$1" "$2" ...
2>&1
— 將命令的stderr
重定向到stdout
,使其成為sed
的stdin
。>&3
— 1>&3
簡寫,這會將stdout
重定向到一個新的臨時文件描述符3
。 3
稍后被路由回stdout
。sed ...
— 由於上述重定向, sed
的stdin
是已執行命令的stderr
。 它的功能是用顏色代碼包圍每一行。$'...'
一個 bash 構造,使其能夠理解反斜杠轉義的字符.*
— 匹配整行。\\e[31m
— ANSI 轉義序列,導致以下字符變為紅色&
— 擴展為整個匹配字符串(在本例中為整行)的sed
替換字符。\\e[m
— 重置顏色的 ANSI 轉義序列。>&2
— 1>&2
簡寫,這會將sed
的stdout
重定向到stderr
。3>&1
— 將臨時文件描述符3
重定向回stdout
。這是同一概念的擴展,也使 STDOUT 變為綠色:
function stdred() (
set -o pipefail;
(
"$@" 2>&1>&3 |
sed $'s,.*,\e[31m&\e[m,' >&2
) 3>&1 |
sed $'s,.*,\e[32m&\e[m,'
)
您還可以查看 stderred: https : //github.com/sickill/stderred
我看不到終端模擬器有什么方法可以做到這一點。
終端模擬器和 shell/app 之間的接口是通過一個偽 tty,其中終端模擬器在主端,shell/app 在另一個。 shell/app 將 stdout 和 stderr 都連接到同一個 pty,因此當終端仿真器從 pty 讀取 shell/app 輸出時,它無法再分辨哪個寫入了 stdout,哪個寫入了 stderr。
您將不得不使用其中一種解決方案來攔截應用程序和 slave-pty 之間的數據並插入轉義碼來控制終端輸出 colo(u)r。
這是一個小 Awk 腳本,它將打印您傳遞給它的所有內容為紅色。
#!/usr/bin/awk -f
{ printf("%c[%dm%s%c[0m\n", 0x1B, 31, $0, 0x1B); fflush() }
它只是在必要的轉義碼中打印它在stdin 上接收到的每一行,以將其顯示為紅色。 后面跟着一個用於重置終端的轉義碼。
(如果您需要不同的顏色,請將上述printf
調用中的第二個參數從 31 更改為與所需顏色對應的數字。)
將其保存到colr.awk
,執行chmod a+x
,然后像這樣使用它:
$ my_program | ./colr.awk
它的缺點是行可能無法按順序顯示,因為 stderr 直接進入控制台,而 stdout 則通過額外的進程進行管道傳輸。
將 stdout 着色為紅色的一個簡單解決方案是通過grep
將其通過管道傳輸:
program | grep .
這應該不需要安裝任何東西,因為grep
應該已經安裝在任何地方。
我認為您應該在 stderr 上使用標准轉義序列。 看看這個。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.