tput

通過terminfo數據庫對終端會話進行初始化和操作

補充說明

tput命令 將通過 terminfo 數據庫對您的終端會話進行初始化和操作。通過使用 tput,您可以更改幾項終端功能,如移動或更改光標、更改文本屬性,以及清除終端屏幕的特定區域。

什麼是 terminfo 數據庫?

UNIX 系統上的 terminfo 數據庫用於定義終端和打印機的屬性及功能,包括各設備(例如,終端和打印機)的行數和列數以及要發送至該設備的文本的屬性。UNIX 中的幾個常用程序都依賴 terminfo 數據庫提供這些屬性以及許多其他內容,其中包括 vi 和 emacs 編輯器以及 curses 和 man 程序。

與 UNIX 中的大多數命令一樣,tput 命令既可以用在 shell 命令行中也可以用在 shell 腳本中。爲讓您更好地理解 tput,本文首先從命令行講起,然後緊接着講述 shell 腳本示例。

光標屬性

在 UNIX shell 腳本中或在命令行中,移動光標或更改光標屬性可能是非常有用的。有些情況下,您可能需要輸入敏感信息(如密碼),或在屏幕上兩個不同的區域輸入信息。在此類情況下,使用 tput 可能會對您有所幫助。

1tput clear # 清屏
2tput sc # 保存當前光標位置
3tput cup 10 13 # 將光標移動到 row col
4tput civis # 光標不可見
5tput cnorm # 光標可見
6tput rc # 顯示輸出
7exit 0

移動光標

使用 tput 可以方便地實現在各設備上移動光標的位置。通過在 tput 中使用 cup 選項,或光標位置,您可以在設備的各行和各列中將光標移動到任意 X 或 Y 座標。設備左上角的座標爲 (0,0)。

要在設備上將光標移動到第 5 列 (X) 的第 1 行 (Y),只需執行 tput cup 5 1。另一個示例是 tput cup 23 45,此命令將使光標移動到第 23 列上的第 45 行。

移動光標並顯示信息

另一種有用的光標定位技巧是移動光標,執行用於顯示信息的命令,然後返回到前一光標位置:

1(tput sc ; tput cup 23 45 ; echo “Input from tput/echo at 23/45” ; tput rc)

下面我們分析一下 subshell 命令:

1tput sc

必須首先保存當前的光標位置。要保存當前的光標位置,請包括 sc 選項或“save cursor position”。

1tput cup 23 45

在保存了光標位置後,光標座標將移動到 (23,45)。

1echo “Input from tput/echo at 23/45”

將信息顯示到 stdout 中。

1tput rc

在顯示了這些信息之後,光標必須返回到使用 tput sc 保存的原始位置。要使光標返回到其上次保存的位置,請包括 rc 選項或“restore cursor position”。

注意:由於本文首先詳細介紹了通過命令行執行 tput,因此您可能會覺得在自己的 subshell 中執行命令要比單獨執行每條命令然後在每條命令執行之前顯示提示更簡潔。

更改光標的屬性

在向某一設備顯示數據時,很多時候您並不希望看到光標。將光標轉換爲不可見可以使數據滾動時的屏幕看起來更整潔。要使光標不可見,請使用 civis 選項(例如,tput civis)。在數據完全顯示之後,您可以使用 cnorm 選項將光標再次轉變爲可見。

文本屬性

更改文本的顯示方式可以讓用戶注意到菜單中的一組詞或警惕用戶注意某些重要的內容。您可以通過以下方式更改文本屬性:使文本加粗、在文本下方添加下劃線、更改背景顏色和前景顏色,以及逆轉顏色方案等。

要更改文本的顏色,請使用 setb 選項(用於設置背景顏色)和 setf 選項(用於設置前景顏色)以及在 terminfo 數據庫中分配的顏色數值。通常情況下,分配的數值與顏色的對應關係如下,但是可能會因 UNIX 系統的不同而異:

  • 0:黑色
  • 1:藍色
  • 2:綠色
  • 3:青色
  • 4:紅色
  • 5:洋紅色
  • 6:黃色
  • 7:白色

執行以下示例命令可以將背景顏色更改爲黃色,將前景顏色更改爲紅色:

1tput setb 6 tput setf 4

要反顯當前的顏色方案,只需執行tput rev

有時,僅爲文本着色還不夠,也就是說,您想要通過另一種方式引起用戶的注意。可以通過兩種方式達到這一目的:一是將文本設置爲粗體,二是爲文本添加下劃線。

要將文本更改爲粗體,請使用 bold 選項。要開始添加下劃線,請使用 smul 選項。在完成顯示帶下劃線的文本後,請使用 rmul 選項。

實例

使輸出的字符串有顏色,底色,加粗:

 1#!/bin/bash
 2printf $(tput setaf 2; tput bold)'color show\n\n'$(tput sgr0)
 3
 4for((i=0; i<=7; i++)); do
 5    echo $(tput setaf $i)"show me the money"$(tput sgr0)
 6done
 7
 8printf '\n'$(tput setaf 2; tput setab 0; tput bold)'background color show'$(tput sgr0)'\n\n'
 9
10for((i=0,j=7; i<=7; i++,j--)); do
11    echo $(tput setaf $i; tput setab $j; tput bold)"show me the money"$(tput sgr0)
12done
13
14exit 0

輸出格式控制函數:

 1#!/bin/bash
 2
 3# $1 str       print string
 4# $2 color     0-7 設置顏色
 5# $3 bgcolor   0-7 設置背景顏色
 6# $4 bold      0-1 設置粗體
 7# $5 underline 0-1 設置下劃線
 8
 9function format_output(){
10    str=$1
11    color=$2
12    bgcolor=$3
13    bold=$4
14    underline=$5
15    normal=$(tput sgr0)
16
17    case "$color" in
18        0|1|2|3|4|5|6|7)
19            setcolor=$(tput setaf $color;) ;;
20        *)
21            setcolor="" ;;
22    esac
23
24    case "$bgcolor" in
25        0|1|2|3|4|5|6|7)
26            setbgcolor=$(tput setab $bgcolor;) ;;
27        *)
28            setbgcolor="" ;;
29    esac
30
31    if [ "$bold" = "1" ]; then
32        setbold=$(tput bold;)
33    else
34        setbold=""
35    fi
36
37    if [ "$underline" = "1" ]; then
38        setunderline=$(tput smul;)
39    else
40        setunderline=""
41    fi
42
43    printf "$setcolor$setbgcolor$setbold$setunderline$str$normal\n"
44}
45
46format_output "Yesterday Once more" 2 5 1 1
47
48exit 0

光標屬性例子:

 1#!/bin/bash
 2# clear the screen
 3tput clear
 4# Move cursor to screen location X,Y (top left is 0,0)
 5tput cup 3 15
 6# set a foreground colour using ANSI escape
 7tput setaf 3
 8echo "XYX Corp LTD."
 9tput sgr0
10tput cup 5 17
11# Set reverse video mode
12tput rev
13echo "M A I N - M E N U"
14tput sgr0
15tput cup 7 15
16echo "1\. User Management"
17tput cup 8 15
18echo "2\. service Management"
19tput cup 9 15
20echo "3\. Process Management"
21tput cup 10 15
22echo "4\. Backup"
23# Set bold mode
24tput bold
25tput cup 12 15
26read -p "Enter your choice [1-4] " choice
27tput clear
28tput sgr0
29tput rc
30
31exit 0

來源:https://github.com/jaywcjlove/linux-command

最後修改於: Wednesday, January 31, 2024

相關文章:

翻譯: