星號:如何更改 CLI 顏色提示?
Asterisk wiki說 CLI 提示的顏色可以用
%Cn[;n]
. IE:export ASTERISK_PROMPT="%C31[%H]: "
但是當我使用上面的導出時,我得到了錯誤的提示
[1;31m[voip]: [1;0m
,voip
我的主機名在哪裡。我的終端是彩色的。事實上,我在
zsh
和中使用顏色bash
。並echo $TERM
給我:xterm-256color
這是我的終端的螢幕截圖:
可以看出,即使是星號消息/日誌也是彩色的。我在星號郵件列表上詢問過,語法
export ASTERISK_PROMPT="%C31[%H]: "
是正確的。有些人報告說顏色提示對他們有用,其他人也有與我報告的問題相同的問題。這讓我懷疑,問題可能不在星號上,而是作業系統環境、終端、終端仿真器等的一些複雜相互作用。
我嘗試了幾種不同的終端仿真器:
terminator
,xterm
,gnome-terminal
,eterm
,konsole
. 問題是一樣的。我在星號伺服器和我連接的桌面上都使用 Debian 10。
如何在 Asterisk 上獲得彩色 CLI 提示?
所需庫
Asterisk 使用 libedit 作為提示符,該庫的舊版本不支持著色,需要高於 3.1-20181209 的版本,在 Debian 上我們可以使用以下內容更新軟體包:
# Download the package from Debian 11 wget http://ftp.br.debian.org/debian/pool/main/libe/libedit/libedit2_3.1-20191231-1_amd64.deb wget http://ftp.br.debian.org/debian/pool/main/libe/libedit/libedit-dev_3.1-20191231-1_amd64.deb # Update libedit dpkg -i libedit-dev_3.1-20191231-1_amd64.deb libedit2_3.1-20191231-1_amd64.deb # Check the installed version apt list --installed | grep edit # As a side note here is the Asterisk install process: cd /sources/dir ./configure make clean make install -j8 make config make samples
星號提示色塊:
Asterisk 在實現提示著色時確實存在錯誤,以下更新檔(針對 v16.2.1)介紹了
ASTERISK_PCOLOR
可以設置為顏色編號的 env 變數的用法,例如export ASTERISK_PCOLOR="031"
紅色;歡迎任何人在上游 PR 此更新檔,在應用更新檔後確保使用make clean
之前make install
(作為獎勵,此更新檔還支持粗體和背景著色。例如export ASTERISK_PCOLOR="1;31;41"
:)--- main/asterisk.c +++ main/asterisk.c @@ -2548,7 +2548,7 @@ return CLI_SUCCESS; } -#define ASTERISK_PROMPT "*CLI> " +#define ASTERISK_PROMPT "*CLI>" /*! * \brief Shutdown Asterisk CLI commands. @@ -2725,6 +2725,7 @@ { char tmp[100]; char *pfmt; + char *pcolor; int color_used = 0; static int cli_prompt_changes = 0; struct passwd *pw; @@ -2738,6 +2739,12 @@ ast_str_reset(prompt); } + if (!(pcolor = getenv("ASTERISK_PCOLOR" ))) { + pcolor = "0"; + } + + ast_str_append(&prompt, 0, "\1\033[%sm\1", pcolor); + if ((pfmt = getenv("ASTERISK_PROMPT"))) { char *t = pfmt; struct timeval ts = ast_tvnow(); @@ -2839,11 +2846,13 @@ ast_term_color_code(&prompt, 0, 0); } } else { - ast_str_set(&prompt, 0, "%s%s", + ast_str_append(&prompt, 0, "%s%s", remotehostname ? remotehostname : "", ASTERISK_PROMPT); } + ast_str_append(&prompt, 0, "\1\033[0m\1 "); + return ast_str_buffer(prompt); } @@ -3034,7 +3043,7 @@ history_end(el_hist); el = el_init("asterisk", stdin, stdout, stderr); - el_set(el, EL_PROMPT, cli_prompt); + el_set(el, EL_PROMPT_ESC, cli_prompt, '\1'); el_set(el, EL_EDITMODE, 1); el_set(el, EL_EDITOR, editor);
對此沒有本地修復。
編輯線
NetBSD 編輯線多年來不支持彩色提示。它據稱支持彩色提示的機制不起作用,並且自 2015 年(可能更早)以來就已知存在故障。你看到的是錯誤機制的結果。
Nick Zavaritsky有一個編輯線的分支,它不僅正確支持彩色提示,還支持正在編輯的行的(語法)著色,因為它儲存了左/右提示字元和中字元的圖形再現資訊編輯緩衝區。
香草編輯線採取了不同的,可以說是劣等的路線。在 2017 年,“文字”機制出現了,以便提示字元串中的文字實際上以正確的順序發出,並且不會破壞線寬計算以啟動。(可以說它是劣質的,因為它不支持像 Zavaritsky 風格那樣的任意著色。它保留了原始使用此字元來標記原始設計的文字序列機制,但可以說這是一個旨在保留的糟糕設計。它也依賴嚴重依賴客戶端應用程序為顏色序列進行自己的 termcap 查找。正如我們將看到的,在 Asterisk 的情況下,這種依賴是錯誤的。)
星號
Asterisk 使用 NetBSD 編輯線,也就是Debian 命名法中的libedit,不要與 Debian 稱為editline的另一個庫混淆。
它手動在提示中建構著色序列,其方式與 1990 年代初期的 16 色終端仿真器並不真正兼容,更不用說支持 256 色或 24 位顏色的終端仿真器了. 不使用 termcap/terminfo 來查找
setaf
和setab
可用的顏色數量,它只是硬連線 color 的轉義序列,並把它們弄錯了,混淆了 bright 和 bold,錯誤地認為 VT100 有顏色(VT100 是單色的。),而不是處理超過 8 種顏色,最終在各處發出 SGR 0(而不是 SGR 22)。Asterisk 不使用 Zavaritsky 風格的編輯線,它(具有諷刺意味)具有不支持 AIXterm 16 顏色的相同問題,並且至少在它如何錯誤地解析 Asterisk 錯誤構造的轉義序列方面是錯誤兼容的。☺
使用舊版的編輯線,您所看到的實際上是預期的結果。轉義序列以非轉義形式列印。2017 年後的原版編輯線應該將它們作為實際的轉義序列發出。 到 2018 年,它進入了 Debian。Debian 隨後在 2019 年重建了其 Asterisk 二進製文件。
服務修復
所以有一個服務修復。確保您的包管理器擁有比 3.1-20181209 更新的 libedit 和比 1:16.1.1 更新的 Asterisk。至少問題會明顯不同。您將不會再看到問題中的效果,但您可能會看到使用粗體字型、亮色不亮、“日曬”顏色主題無法完全發揮作用等問題。
如果您仍然發現這些版本有問題,請向 Asterisk 和 NetBSD 編輯人員投訴;他們真的只是在裂縫上用紙蓋住了,在這裡。