簡體   English   中英

是否可以在 XTerm 或 Konsole 中使 stdout 和 stderr 輸出具有不同的顏色?

[英]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 ,使其成為sedstdin
  • >&31>&3簡寫,這會將stdout重定向到一個新的臨時文件描述符3 3稍后被路由回stdout
  • sed ... — 由於上述重定向, sedstdin是已執行命令的stderr 它的功能是用顏色代碼包圍每一行。
  • $'...'一個 bash 構造,使其能夠理解反斜杠轉義的字符
  • .* — 匹配整行。
  • \\e[31m — ANSI 轉義序列,導致以下字符變為紅色
  • & — 擴展為整個匹配字符串(在本例中為整行)的sed替換字符。
  • \\e[m — 重置顏色的 ANSI 轉義序列。
  • >&21>&2簡寫,這會將sedstdout重定向到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應該已經安裝在任何地方。

摘自丹尼斯對 superuser.com 的評論

我認為您應該在 stderr 上使用標准轉義序列。 看看這個

海力特會做到這一點。 這是一個輕量級的解決方案,但您必須為每個命令調用它,例如。 hilite gcc myprog.c 我的實驗外殼Gush內置了一種更激進的方法,它顯示所有命令的 stderr 運行時為紅色,stdout 為黑色。 無論哪種方式對於軟件構建都非常有用,在這種情況下,您有大量輸出和一些錯誤消息,如果不突出顯示,很容易遺漏這些消息。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM