深入理解Shell輸出顏色與控制

2022-10-06 20:09:19 字數 1969 閱讀 9425

前言

大家都知道使用ls命令列出檔案列表時,不同的檔案型別會用不同的程式設計客棧顏色顯示。那麼如何實現這樣帶顏色的文字輸出呢?答案並不複雜,不管是用shell還是c語言。

一、shell下的實現方法

先來講在shell下,如何實現。用echo命令就可以實現,參看以下例子:

echo -e "33[32mhello, world!"

當你在終端裡敲下這條命令後,是不是發現系統用綠色輸出了"hello,world!",不止如此,連之後的命令提示符都變成了綠色?不要著zrjob急,聽我繼續說。echo命令-e選項的作用是啟用終端對反斜線轉義符(即)的解釋。引號內33用於引導非常規字串行,在這裡的作用就是引導設定輸出屬性,後邊的[32m就是將前景色設定為綠色,字母m表示設定的屬性類別,數字代表屬性值。

設定可以單獨使用,例如:

echo -e "33[0m"

這行命令的作用是恢復屬性為預設值,也就是說0m設定項用於恢復預設值。現在你的終端是不是又一切正常了?

理解了這些,剩下的就簡單了。用這種命令,除了設定文字前景色,還可以設定很多屬性。

下邊列出其他的設定項:

33[0m 關閉所有屬性

33[1m 設定高亮度

33[4m 下劃線

33[5m 閃爍

33[7m 反顯

33[8m 消隱

33[30m 至 33[37m 設定前景色

33[40m 至 33[47m 設定背景色

33[na 游標上移n行

33[nb 游標下移n行

33[nc 游標右移n行

33[nd 游標左移n行

33[y;xh設定游標位置

33[2j 清屏

33[k 清除從游標到行尾的內容

33[s 儲存游標位置

33[u 恢復游標位置

33[?25l 隱藏游標

33[?25h 顯示游標

各數字所代表的顏色如下:

字背景顏色範圍:40----49

40:黑

41:深紅

42:綠

43:黃色

44:藍色

45:紫色

46:深綠

47:白色

字顏色:30-----------39

30:黑

31:紅 

32:綠

33:黃zrjob

34:藍色

35:紫色

36:深綠 

37:白色

另外,同類的多種設定項可以組合在一起,中間用分號(;)隔開。

如下:echo -e "33[20;1h33[1;4;32mhello,world33[0m"

這行命令首先33[20;1h將游標移動到終端第20行第1列,之後的33[1;4;32m將文字程式設計客棧屬性設定為高亮、帶下劃線且顏色為綠色,然後輸出hello程式設計客棧,world;最後33[0m將終端屬性恢復為預設值,這樣就不會看到連命令完成後的命令提示符也變了樣兒了。

通過以上各種命令的組合就可以實現對終端輸出地複雜控制。

二、如何在c程式設計中實現?

理解了以上在shell中的實現方法,關於在c中如何實現就很簡單了。可以說只需要用printf函式代替上邊的echo -e就ok了參見下例:

int color = 32;

printf("33[20;1h33[1;4;%dmhello, world.33[0m", color);

這個例子類似上邊shell中最後那個例子,只是這裡顏色值通過變數color來指定(當然,也可以直接指定)。

三、聯想

看到這裡你可能會想,是不是在其他程式語言裡也可以用類似的方法實現對終端輸出的控制呢?答案是肯定的!比如在python中,可以如下輸出:

color=32

print 「33[20;1h33[1;4;%dhello, world.33[0m"%color

這個例子的效果跟上邊c的例子是相同的。

總結本文標題: 深入理解shell輸出顏色與控制

本文位址:

深入理解查準率與查全率

查準率與查全率 召回率 是在資訊檢索與機器學習領域常用的衡量指標,書籍或網路上有非常多的定義,敝人在重溫周志華先生 機器學習 一書時,發現書中的定義是非常科學的,而且把這兩個指標根據混淆矩陣進行了數學化!在資訊檢索領域的定義 檢索出的n個文件中正確結果 m個結果是正確的 的比率即是查準率,即p n ...

深入理解CAS與AQS

二 aqs 首先,cas是一種演算法,不是鎖cas,其實是個簡稱,全稱是 compare and swap,對比之後交換資料 expect 期望更新的值 一開始獲取的值 update 要更新的最新值 如果原子變數中的 value 值等於 expect,則使用 update 值更新該值並返回 true...

深入理解java抽象與介面

1,abstract 修飾類 抽象類 2,abstract 修飾方法 抽象方法 3,抽象方法只有宣告,而沒有具體的方法實現部分 注意 抽象類中的抽象方法,強制其子類重寫抽象方法 抽象類不能建立物件,因為其含有無具體實現的方法 抽象類建立物件的方式可仿照多型 抽象類中不一定有抽象方法,但抽象方法一定在...