क्या tput पर दृश्यों से बचने के लिए कोई उद्देश्य लाभ है?


11

लोगों की .*rcफ़ाइलों में मैं ऑनलाइन या विभिन्न कोड में देखता हूं, मैं बहुत से ऐसे लोगों को देखता हूं जो मैन्युअल रूप से एएनएसआई से बचने के दृश्यों का उपयोग करते हैं tput

मुझे समझ थी कि tputयह अधिक सार्वभौमिक / सुरक्षित है, इसलिए यह मुझे आश्चर्यचकित करता है:

क्या कोई वस्तुनिष्ठ कारण है जिसके स्थान पर पलायन क्रम का उपयोग करना चाहिए tput? (पोर्टेबिलिटी, त्रुटियों पर मजबूती, असामान्य टर्मिनल ...?)


पोर्टेबिलिटी प्रश्न के फ्लिप पक्ष पर, MobaXterm printfएएनएसआई से बचने के क्रम के साथ काम करेगा , लेकिन tputविफल रहता है (कम से कम मेरे बॉक्स पर)।
वाइल्डकार्ड

जवाबों:


6

tput(में उदाहरण के लिए भाव संभाल कर सकते हैं sgrऔर setaf) जो ठेठ खोल-scripter प्रयोग करने योग्य की तुलना में कम होगी। क्या शामिल है, इसका अंदाजा लगाने infocmpके लिए -f(स्वरूपण) विकल्प के साथ आउटपुट देखें । यहाँ एक उदाहरण है xterm के टर्मो विवरण से उन तार का उपयोग करते हुए :

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-रंग की सुविधा आईबीएम ऐक्स्टेरम से उधार ली गई है, जो अग्रभूमि और पृष्ठभूमि के लिए प्रत्येक पर दो श्रेणियों में 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 मैच के लिए ECMA-48 रंग (जिसे "एएनएसआई" कहा जाता है) 30-37 और 40-47 पर्वतमाला का उपयोग करता है, और कोड के लिए 90-107 रेंज का उपयोग करता है नहीं मानक में परिभाषित।

यहाँ xterm का उपयोग करते हुए एक स्क्रीनशॉट है TERM=xterm-16color, जहाँ आप प्रभाव देख सकते हैं।

यहां छवि विवरण दर्ज करें

आगे की पढाई:


मैं आपकी बात को सही साबित कर सकता हूं, लेकिन इन भावों का क्या मतलब है? Infocmp के लिए मैनुअल को देखने से मुझे लगता है कि वे अगर-तब-तब बयान करते हैं ... लेकिन मैंने इसे कभी नहीं देखा है और मुझे इसके लिए googling में परेशानी हो रही है, यह सब मुझे मिला है, लेकिन मुझे यकीन नहीं है यहाँ क्या हो रहा है। धन्यवाद!
कप्तान मैन

2

ऐसे समय से आ रहा है जब UNIX प्लेटफ़ॉर्म में विभिन्न प्रकार के उपकरण हो सकते हैं, मैं अभी भी शाब्दिक रूप से भागने के क्रम में tput और इसके दोस्तों को पसंद करता हूं।

मुझे लगता है कि असली कारण यह है कि ज्यादातर लोग tputइसके बारे में और इससे जुड़ी फाइलों terminfo/ termcapपुस्तकालयों के बारे में नहीं जानते हैं ।


1

एक कारण यह है कि tputबाहरी कमांड है, इसलिए अंतर्निहित शेल एस्केप कोड की तुलना में धीमी गति से चल सकता है। एक और बात यह है कि कोई भी आसानी से शेल विशिष्ट फरार पात्रों के साथ ANSI एस्केप कोड को मिलाकर एक लाइनर बना सकता है, जैसे कि bashउदाहरण के लिए:

PS1='\[\033[1;32m\]\u@\h\[\033[1;34m\] \w >\[\033[0m\] '

इसी तरह से zsh:

PS1=$'%{\e[1;32m%}%n@%m%{\e[1;34m%} %3~> %{\e[0m%}'

यहां सब कुछ स्पष्ट और कॉम्पैक्ट है। tputएक के साथ इसे कई लाइनों में विभाजित करना होगा या इसे बहुत लंबी और जटिल रेखा बनाना होगा, tputकई बार निष्पादित करना होगा, आदि।


1
Tput के साथ आप अभी भी oneliners कर सकते हैं, PS1="$(tput setaf 2)\u@\h$(tput reset) >
कप्तान मैन

2
वास्तव में यह $(tput sgr0)अंत के लिए होगा , लेकिन इस बात से सहमत होना कि tput एक सुधार है।
थॉमस डिकी
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.