Terminal

轉義序列比 tput 有什麼客觀好處嗎?

  • April 26, 2021

在我在網上看到的人們的 ’ .*rc’ 文件或各種程式碼中,我傾向於看到很多人手動使用 ANSI 轉義序列而不是使用tput.

我有更普遍/更安全的理解tput,所以這讓我想知道:

是否有任何客觀原因應該使用轉義序列代替tput?(可移植性、對錯誤的強韌性、異常終端……?)

tput可以處理典型的 shell-scripter 會發現不太可用的表達式(例如 insgr和)。setaf要了解所涉及的內容,請查看應用infocmp-f(格式化)選​​項的輸出。這是使用 xterm 的terminfo 描述中的這些字元串的範例之一:

xterm-16color|xterm with 16 colors,
       colors#16,
       pairs#256,
       setab=\E[
               %?
                       %p1%{8}%<
                       %t%p1%{40}%+
               %e
                       %p1%{92}%+
               %;%dm,
       setaf=\E[
               %?
                       %p1%{8}%<
                       %t%p1%{30}%+
               %e
                       %p1%{82}%+
               %;%dm,
       setb=
               %p1%{8}%/%{6}%*%{4}%+\E[%d%p1%{8}%m%Pa
               %?%ga%{1}%=
                       %t4
               %e%ga%{3}%=
                       %t6
               %e%ga%{4}%=
                       %t1
               %e%ga%{6}%=
                       %t3
               %e%ga%d
               %;
               m,
       setf=
               %p1%{8}%/%{6}%*%{3}%+\E[%d%p1%{8}%m%Pa
               %?%ga%{1}%=
                       %t4
               %e%ga%{3}%=
                       %t6
               %e%ga%{4}%=
                       %t1
               %e%ga%{6}%=
                       %t3
               %e%ga%d
               %;
               m,
       use=xterm+256color,
       use=xterm-new,

格式將事情分開 - 執行相同操作的腳本或程序必須遵循這些曲折。大多數人放棄並只使用最簡單的字元串。

16 色功能是從 IBM aixterm 借用的,它將前景和背景各 16 個程式碼映射到兩個範圍;

  • 前景到 30-37 和 90-97
  • 背景為 40-47 和 100-107

一個簡單的腳本

#!/bin/sh
TERM=xterm-16color
export TERM
printf '    %12s %12s\n' Foreground Background
for n in $(seq 0 15)
do
   F=$(tput setaf $n | cat -v)
   B=$(tput setab $n | cat -v)
   printf '%2d  %12s %12s\n' $n "$F" "$B"
done

和輸出顯示它是如何工作的:

     Foreground   Background
0        ^[[30m       ^[[40m
1        ^[[31m       ^[[41m
2        ^[[32m       ^[[42m
3        ^[[33m       ^[[43m
4        ^[[34m       ^[[44m
5        ^[[35m       ^[[45m
6        ^[[36m       ^[[46m
7        ^[[37m       ^[[47m
8        ^[[90m      ^[[100m
9        ^[[91m      ^[[101m
10        ^[[92m      ^[[102m
11        ^[[93m      ^[[103m
12        ^[[94m      ^[[104m
13        ^[[95m      ^[[105m
14        ^[[96m      ^[[106m
15        ^[[97m      ^[[107m

這些數字是分開的,因為 aixterm 使用 30-37 和 40-47 範圍來匹配 ECMA-48(也稱為“ANSI”)顏色,並且將 90-107 範圍用於標準中未定義的程式碼。

這是 xterm using 的螢幕截圖TERM=xterm-16color,您可以在其中看到效果。

在此處輸入圖像描述

進一步閱讀:

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