Shell

星號:如何更改 CLI 顏色提示?

  • July 6, 2020

Asterisk wiki說 CLI 提示的顏色可以用%Cn[;n]. IE:

export ASTERISK_PROMPT="%C31[%H]: "

但是當我使用上面的導出時,我得到了錯誤的提示[1;31m[voip]: [1;0mvoip我的主機名在哪裡。

我的終端是彩色的。事實上,我在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 來查找setafsetab可用的顏色數量,它只是硬連線 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 編輯人員投訴;他們真的只是在裂縫上用紙蓋住了,在這裡。

引用自:https://unix.stackexchange.com/questions/590775