क्या टर्मिनल में खाली स्थान / पृष्ठभूमि को ASCII वर्णों के यादृच्छिक (लेकिन सुंदर) पैटर्न से बदला जा सकता है?


23

प्रसंग और प्रश्न

टर्मिनल और शेल वातावरण को रंगीन करने के कई तरीके हैं। व्यक्तिगत आदेशों के आउटपुट, जैसे lsऔर grep, को भी रंगीन किया जा सकता है। प्रत्यक्ष रूप से संबंधित नहीं है, लेकिन फिर भी दिलचस्प गैर- सांत्वना में मीडिया चलाने की धारणा है, लेकिन यह प्रतीत होता है कि विंडो सिस्टम के शीर्ष पर कुछ ढांचे (पुस्तकालयों) पर निर्भर है। निम्नलिखित प्रश्न को पूरी तरह से bashखोल दिया गया है और लिनक्स टर्मिनल फ्रेमवर्क और इसके अंडरपिनिंग में इसके कार्यान्वयन

कृपया 2 डी गेम में एक दृश्य के ASCII "रेंडरिंग" के निम्नलिखित असेंबल पर विचार करें :

बौना किले के खेल से प्रकृति का दृश्य (पेड़, झाड़ियाँ, फूल, घास) - पहले 2 स्क्रीन बिना किसी टाइलसेट (ASCII केवल) के साथ खेल दिखाते हैं, तीसरी स्क्रीन को Vherid टाइल के साथ बनाया गया है, अगले 2 स्क्रीन के साथ उत्पन्न होता है सीएलए टाइलसेट, और आखिरी स्क्रीन जॉली बास्टियन टाइलसेट के साथ उत्पन्न होती है

ये बेतरतीब ढंग से उत्पन्न दृश्य नहीं हैं। जिन खंडों का मैंने चयन किया है, वे वास्तव में "घास के मैदान" इलाके (पेड़, झाड़ियों और झाड़ियों, फूलों, घास आदि) के कुछ रूप को चित्रित करते हैं, जो ऐसी वस्तुओं का प्रतिनिधित्व करने के लिए ASCII वर्णों का उपयोग करता है। अंतिम 4 दृश्यों के प्रदर्शन वाले उपयोगकर्ता ने टाइलें बनाईं जो मूल रूप से रंगीन चश्मे के साथ ASCII वर्णों का रीमैप हैं (इस तरह के विवरण तुच्छ हैं - यह कहने के लिए पर्याप्त है कि यह दृश्य प्रेरणा है जो मैं यहां दृश्य के संदर्भ में पूरा करने की कोशिश कर रहा हूं और " पैटर्न ")।

असेंबल शेयर में उन दृश्यों की सामान्य विशेषताएं हैं:

  • 5-6 अलग-अलग ASCII वर्ण (अल्पविराम, उद्धरण चिह्न और कुछ अन्य)
  • 2-4 रंगों का इस्तेमाल किया
    • पात्रों के लिए
    • कुछ मामलों में चरित्र की पृष्ठभूमि के लिए - एक पैटर्न बनाने के लिए बहुत कम या कोई चरित्र के साथ रंग के रंगों का उपयोग दिखाने के लिए अंतिम उदाहरण है - रंग मोज़ेक

इस समय एक वीएम में मेरे पास आर्क लिनक्स है और हालांकि यह सवाल विशिष्ट वितरण नहीं है, मैंने फ़ाइल को कस्टमाइज़ करने के लिए उनके प्रलेखन में देखा है /etc/bash.bashrc। मैं देख सकता हूं कि बहुत सारे समझाने वाले प्रॉम्प्ट की उपस्थिति और आम तौर पर सभी अग्रभूमि तत्वों को कॉन्फ़िगर करने में जाते हैं। पृष्ठभूमि के लिए किसी भी कॉन्फ़िगरेशन पर बहुत कम जानकारी है, आमतौर पर एक ठोस रंग को छोड़कर, जैसे कि ये सेटिंग्स और टिप्स :

# Background
On_Black='\e[40m'       # Black
On_Red='\e[41m'         # Red
On_Green='\e[42m'       # Green
On_Yellow='\e[43m'      # Yellow
On_Blue='\e[44m'        # Blue
On_Purple='\e[45m'      # Purple
On_Cyan='\e[46m'        # Cyan
On_White='\e[47m'       # White

मैं अभी भी वैचारिक रूप से समझ नहीं पा रहा हूं कि वे रिक्त / रिक्त / पृष्ठभूमि "रिक्त स्थान" क्या हैं जो मैंने टाइप नहीं किया था जब मैं कंसोल का उपयोग करता हूं अर्थात "वे किस चीज से बने होते हैं?" इतनी बात करने के लिए। विशेष रूप से उन है कि संकेत पर नहीं हैं, और जो गूंज रहे हैं आदेशों के आसपास लपेटो। सक्रिय रेखा पर क्या होता है, इसके संबंध में, यह प्रदर्शित करना संभव है कि bash"लाइन-ओरिएंटेड" तरीके से कार्य करता है और यह कि कुछ ऑपरेशन सक्रिय लाइन की क्लीयरिंग को ट्रिगर करते हैं ( for i in $(seq 1 $(expr $(tput lines) \* $(tput cols))); do echo -n M; done; tput cup 15 1फिर, प्रॉम्प्ट पर एक char और backspace इसे टाइप करते हैं - प्रदर्शित एक अंशदाता) - जिसकी सीमा एक CLI से दूसरे यानी zsh में भिन्न हो सकती है। इसके अलावा, ऐसा लगता है जब मैं \[\033[44m\]अपने PS1 लाइन में कुछ जोड़ता हूं जैसे ही bash.bashrcमुझे बैश को फिर से लोड करने के बाद एक नीली पृष्ठभूमि मिलती है - तो जाहिर है मुझे पता है कि कुछ हैपृष्ठभूमि के रूप में उत्पादन उपस्थिति insofar से अधिक लाभ यहाँ है।

लेकिन मुझे यह भी पता है कि बैश सॉफ्टवेयर सॉफ्टवेयर का एक टुकड़ा है जो स्क्रीन पर चीजों को लाने के लिए TTY सबसिस्टम के रूप में किसी अन्य सुविधा पर निर्भर करता है - और यह वहाँ से नीचे गिरे हुए वीटी घटक को मान लेता है। pstree -Apपर और फिर से systemdजुड़े आर्क शो पर ।loginbash

आर्क लिनक्स वितरण पर निर्भर करता है agettyTTY सेवाओं के लिए। एक साधारण echo $TERMउपयोग में टर्मिनल का प्रकार निकलेगा ("linux" यहाँ किसी भी DE के बाहर) और infocmp[-d spec1 spec2]बिना किसी पैरामीटर के कमांड टर्मिनल टर्मिनल (5) टर्मिनल डेटाबेस से सक्रिय टर्मिनल क्षमताओं और प्रोफ़ाइल जानकारी दिखाता है :

# Reconstructed via infocmp from file: /usr/share/terminfo/l/linux
linux|linux console,
am, bce, ccc, eo, mir, msgr, xenl, xon,
colors#8, it#8, ncv#18, pairs#64,
acsc=+\020\,\021-\030.^Y0\333'\004a\261f\370g\361h\260i\316j\331k\277l\332m\300n\305o~p\304q\304r\304s_t\303u\264v\301w\302x\263y\363z\362{\343|\330}\234~\376,
bel=^G, blink=\E[5m, bold=\E[1m, civis=\E[?25l\E[?1c,
clear=\E[H\E[J, cnorm=\E[?25h\E[?0c, cr=^M,
csr=\E[%i%p1%d;%p2%dr, cub=\E[%p1%dD, cub1=^H,
cud=\E[%p1%dB, cud1=^J, cuf=\E[%p1%dC, cuf1=\E[C,
cup=\E[%i%p1%d;%p2%dH, cuu=\E[%p1%dA, cuu1=\E[A,
cvvis=\E[?25h\E[?8c, dch=\E[%p1%dP, dch1=\E[P, dim=\E[2m,
dl=\E[%p1%dM, dl1=\E[M, ech=\E[%p1%dX, ed=\E[J, el=\E[K,
el1=\E[1K, flash=\E[?5h\E[?5l$, home=\E[H,
hpa=\E[%i%p1%dG, ht=^I, hts=\EH, ich=\E[%p1%d@, ich1=\E[@,
il=\E[%p1%dL, il1=\E[L, ind=^J,
initc=\E]P%p1%x%p2%{255}%*%{1000}%/%02x%p3%{255}%*%{1000}%/%02x%p4%{255}%*%{1000}%/%02x,
kb2=\E[G, kbs=\177, kcbt=\E[Z, kcub1=\E[D, kcud1=\E[B,
kcuf1=\E[C, kcuu1=\E[A, kdch1=\E[3~, kend=\E[4~, kf1=\E[[A,
kf10=\E[21~, kf11=\E[23~, kf12=\E[24~, kf13=\E[25~,
kf14=\E[26~, kf15=\E[28~, kf16=\E[29~, kf17=\E[31~,
kf18=\E[32~, kf19=\E[33~, kf2=\E[[B, kf20=\E[34~,
kf3=\E[[C, kf4=\E[[D, kf5=\E[[E, kf6=\E[17~, kf7=\E[18~,
kf8=\E[19~, kf9=\E[20~, khome=\E[1~, kich1=\E[2~,
kmous=\E[M, knp=\E[6~, kpp=\E[5~, kspd=^Z, nel=^M^J, oc=\E]R,
op=\E[39;49m, rc=\E8, rev=\E[7m, ri=\EM, rmacs=\E[10m,
rmam=\E[?7l, rmir=\E[4l, rmpch=\E[10m, rmso=\E[27m,
rmul=\E[24m, rs1=\Ec\E]R, sc=\E7, setab=\E[4%p1%dm,
setaf=\E[3%p1%dm,
sgr=\E[0;10%?%p1%t;7%;%?%p2%t;4%;%?%p3%t;7%;%?%p4%t;5%;%?%p5%t;2%;%?%p6%t;1%;%?%p7%t;8%;%?%p9%t;11%;m,
sgr0=\E[0;10m, smacs=\E[11m, smam=\E[?7h, smir=\E[4h,
smpch=\E[11m, smso=\E[7m, smul=\E[4m, tbc=\E[3g,
u6=\E[%i%d;%dR, u7=\E[6n, u8=\E[?6c, u9=\E[c,
vpa=\E[%i%p1%dd,

जैसा कि यह खड़ा है, टर्मिनल फ्रेमवर्क से कई क्षमताओं का लाभ उठाया जा सकता है और यह मूल रूप से उन विशेषताओं को है जो bash.bashrc कॉन्फ़िगरेशन फ़ाइल इंसोफ़र में उजागर होती हैं क्योंकि प्रॉम्प्ट को PS1 चर सेट करके अनुकूलित किया जाता है। नियंत्रण और भागने के अनुक्रमों का उपयोग टर्मिनल में डेटाबेस में प्रदर्शित होने वाले चरित्र के प्रवाह को मूल रूप से बाधित करने के लिए किया जाता है, जिसमें कर्सर और टर्मिनल सूचना डेटाबेस में वर्णित अन्य क्षमताओं को स्थानांतरित करना शामिल है। उन कार्यों में से कई को अच्छी तरह से ज्ञात ESC[(या \ 33) नियंत्रण अनुक्रम परिचयकर्ता ( यहां और यहां और अधिक अनुक्रम और कुछ उदाहरण ) का उपयोग करके पारित किया जाता है । इसके अलावा, इसका उपयोग करना भी संभव हैtputकुछ टर्मिनल गुणों को बदलने के लिए सीएलआई पर सीधे उपयोगिता; उदाहरण के लिए tput setab 4नीले रंग की पृष्ठभूमि पर बैश इको कमांड होंगे।

यदि हम strace bashएक्शन में भागने के क्रम और व्यवहार दोनों को देख सकते हैं:

write(2, "[il@Arch64vm1 ~]$ ", 19[il@Arch64vm1 ~]$ ) = 19  //bash starts
rt_sigprocmask(SIG_SETMASK, [], NULL, 8) = 0
rt_sigprocmask(SIG_BLOCK, NULL, [], 8) = 0
read(0, " ", 1) = 1                                 //pressed <space>
rt_sigprocmask(SIG_BLOCK, [INT], [], 8) = 0
write(2, " ", 1 ) = 1
rt_sigprocmask(SIG_SETMASK, [], NULL, 8) = 0
rt_sigprocmask(SIG_BLOCK, NULL, [], 8) = 0
read(0, "\177", 1) = 1                              //pressed <backspace>...
rt_sigprocmask(SIG_BLOCK, [INT], [], 8) = 0
write(2, "\10\33[K", ) = 4                          //triggers erasing the line
rt_sigprocmask(SIG_SETMASK, [], NULL, 8) = 0
rt_sigprocmask(SIG_BLOCK, NULL, [], 8) = 0
read(0, "\33", 1) = 1                               //pressed <esc> per se

यह प्रश्न के लिए संदर्भ प्रदान करता है कि क्या टर्मिनल में खाली स्थान / पृष्ठभूमि का रंग ASCII वर्णों के यादृच्छिक (लेकिन सुंदर) सेट से बदला जा सकता है? लेकिन इस बात का कोई अंदाजा नहीं है कि मैं टर्मिनल में किस तरह की विशेषताओं को लागू कर रहा हूं या क्या देख रहा हूं।

इसलिए मैंने एक क्रूड मॉकअप बनाया है, जिसका उदाहरण यह हो सकता है कि अंतिम परिणाम ऐसा दिख सकता है यदि यह संभव था (गंभीरता से नहीं :):

टर्मिनल का मॉकअप रंगीन ठोस रंग के बजाय पृष्ठभूमि के रूप में रंगीन ASCII वर्णों के एक सेट को प्रदर्शित करता है।  पैटर्न निष्पादित कमांड के आउटपुट के चारों ओर लपेटता है।  सक्रिय कमांड लाइन का एक अलग पैटर्न / रंग होता है, लेकिन यह पैटर्न सीएलआई द्वारा शेल की पूर्ण कार्यक्षमता को संरक्षित करने के लिए कभी भी व्याख्या नहीं करता है

मूल रूप से टर्मिनल में सभी "खाली जगह" पैटर्न के साथ भरी जाएगी (यहाँ मैं ऊपर से छवि में से एक "टाइल" करता हूं, लेकिन मैं प्रत्येक व्यक्ति के लिए वास्तविक कार्यान्वयन में चाहूंगा "रिक्त" को यादृच्छिक रूप से सेट के सेट से उत्पन्न किया जाएगा। 5-6 पात्रों और विशेषताओं को असेंबल से प्रलेखित किया गया है जो निर्दिष्ट किया जाएगा)। सक्रिय कमांड लाइन के लिए एक अलग पैटर्न है, जो लहरदार "पानी" है, लेकिन मैं नीले होने वाली लाइन के लिए व्यवस्थित हो जाऊंगा। जैसा कि यह कल्पना की गई थी, कमांड्स "पानी" को "मिटा" देंगे क्योंकि वे सक्रिय रेखा पर टाइप हो जाते हैं और निश्चित रूप से एक बाधा यह होगी कि वर्णों के पैटर्न को सीएलआई द्वारा कभी भी व्याख्या नहीं किया जाता है अन्यथा यह बेकार हो जाएगा।

तो क्या bashटर्मिनल फ्रेमवर्क में या उसके अंदर कोई विन्यास सामने आया है , या एक स्क्रिप्ट जो वर्णों के एक सेट का उपयोग करने की अनुमति देगी और टर्मिनल में बैश के उत्पादन को संशोधित करने के लिए रंगों पर कुछ नियंत्रण होगा ताकि पृष्ठभूमि के लिए कुछ यादृच्छिक पैटर्न उत्पन्न हो सके। (जो मैंने ऊपर दिखाया है, उसके समान होगा) या मैं बस के लिए पृष्ठभूमि के रूप में एक पूर्ण पैटर्न छवि की आपूर्ति करने की कोशिश कर कुछ की तरह बसना चाहिए ?

क्रियान्वयन

0.1 - पैटर्नॉट संस्करण (लॉगिन करते समय एक शॉट सौदा)

निम्न अभिव्यक्ति जो मैंने अपने .bashrc फ़ाइल में जोड़ी है, हमने कुछ धारणाओं का पता लगाया है और हमने मानक लिनक्स टर्मिनल में विज़ुअल्स के लिए अवधारणा का एक (बहुत) मूल प्रमाण प्रस्तुत किया है:

for i in $(seq 1 $(expr $(tput lines))); do echo -en '\E[32;32m'$(tr -dc '",.;:~' < /dev/urandom | head -c $(tput cols)); done; tput cup 15; tput setab 4; echo -en "\E[2K"; tput setab 0

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

टिप्पणियों

  • यह स्पष्ट रूप से सिर्फ एक कमांड है, इसलिए यह स्थायी नहीं है यानी यह स्क्रॉल दूर है क्योंकि कमांड टाइप हो जाता है
  • व्यक्तिगत रूप से चयन क्रमहीन मत अक्षरों यानी विकल्प चुना head -c 1के साथ tput colsयह बहुत धीमी गति से है, क्योंकि - लाइनों गुणा के साथ शुरू है, जो उद्धृत चयन से व्यक्ति यादृच्छिक वर्ण मुद्रित होगा। मुझे नहीं लगता कि randomएक (tput cols) लंबा पूर्णांक उत्पन्न करता है लेकिन फिर भी यह तेज है। निश्चित रूप से यह सब बहुत बेकार है लेकिन यह काम करता है।
  • हरे रंग के अलावा किसी भी रंग या प्रभाव को यादृच्छिक रूप से नियंत्रित नहीं किया गया है या अन्यथा उस हरे को छोड़कर क्योंकि जैसा कि मैंने समझाया कि प्रत्येक चार को व्यक्तिगत रूप से प्रस्तुत करना / प्रसंस्करण करना बहुत धीमा है। पुन :: फ्रेम बफ़र?
  • मुझे यह देखकर खुशी हुई कि पैटर्न सीएलआई द्वारा व्याख्या नहीं किए जाने के अर्थ में सीएलआई उपयोग में हस्तक्षेप नहीं करता है! (हालांकि मैं क्यों नहीं समझा सकता)
  • पानी बहुत तेज चला गया है! ;-)

0.2 - PROMPT_COMMAND हैक नौकरी

परिवर्तन के मूल्य PROMPT_COMMAND को बैश प्रिंट से पहले प्रत्येक प्राथमिक संकेत की जांच की जाती है। मुझे पता है कि आमतौर पर आप एक स्क्रिप्ट को कॉल करने के लिए वैरिएबल का उपयोग करेंगे जहां आप डिस्प्ले आदि से तत्वों को प्रोसेस कर सकते हैं, लेकिन मैं सीधे मेरी .bashrc फ़ाइल में सीधे करने की कोशिश कर रहा हूं। शुरू में मुझे लगा कि मैं कुछ स्थिति संबंधी जागरूकता को लागू कर सकता हूं, जहां निष्पादन से पहले कर्सर है (इसलिए मैं स्क्रीन पर चीजों को कहीं भी प्रस्तुत कर सकता हूं और tputफिर उस स्थिति में वापस आ सकता हूं जो मैं पहले था, स्थिति को निकालने के लिए कुछ इस तरह का उपयोग करके :

stty -echo; echo -n $'\e[6n'; read -d R x; stty echo; echo ${x#??}  //value is in x;x format so...

मैं मान को पाइप करूँगा cut -f1 -d";"। मैं सीएलआई पर ऐसा कर सकता हूं, लेकिन पीएस 1 / पी_सी चर में तत्वों के अनुक्रम के अंदर यह काम करना फिलहाल मेरी पहुंच से बाहर है और संभव है कि PROMPT_COMMAND में जो भी कमांड डाली जाए, उसका मूल्यांकन हर गाड़ी के रिटर्न में न किया जाए, बल्कि हर बार निष्पादित होने के बावजूद केवल एक बार (?) (नीचे टिप्पणियों को देखें)।

तो मैं जो सबसे अच्छा कर सकता था वह अपने प्रारंभिक अनुक्रम को पूरा करने और PROMPT_COMMAND और .bashrc में PS1 चर की परिभाषा दोनों में कुछ कमांड जोड़ सकता है। इस तरह:

PROMPT_COMMAND="echo -en '\E[32;32m'$(tr -dc ',.:~' < /dev/urandom | head -c $(echo "$[$(tput cols) * 2]"))"

PS1="$(echo -en '\n') $(tput setab 4)$(echo -en "\E[2K")$(tput setab 0)\[\033[7;32m\]df:\[\033[1;34m\] \W @d \[\033[0m\]\e[32m"

for i in $(seq 1 $(expr $(tput lines))); do echo -en '\E[32;32m'$(tr -dc '",.;:~' < /dev/urandom | head -c $(tput cols)); done; tput cup 1; tput setab 4; echo -en "\E[2K"; tput setab 0

सारांश में, मैं P_C का उपयोग कर रहा हूं ताकि एक स्थायी दृश्य पैटर्न को लागू करने का प्रयास किया जा सके अर्थात 2 लाइनें जोड़ी जा सकें। दुर्भाग्य से मैं अपनी "वाटर" ट्रिक को दोहराते हुए इस पैटर्न को बनाने में सफल नहीं हो सकता अर्थात सक्रिय लाइन ब्लू (जो सिर्फ बैकग्राउंड कलर बदल रहा है, क्लियर लाइन कर रहा है, फिर बैकग्राउंड को ब्लैक में बदल रहा है)। मैंने यह दिखाने के लिए एक साथ एक चित्र डाला है कि यह कैसे एक साथ चलता है:

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

टिप्पणियों

  • एक लाइन पर बैकस्पेस का उपयोग करना अभी भी स्पष्ट रेखा व्यवहार को ट्रिगर करता है और नीला चला जाता है
  • हर बार एंटर की दबाए जाने पर नई सक्रिय लाइन से पहले पैटर्न की 2 लाइनें होती हैं
  • बेशक, जैसा कि हम अतिरिक्त रेखाओं के बावजूद नीचे देखते हैं, हम पैटर्न को कमांड की तरफ से लपेट नहीं रहे हैं जैसे कि ls
  • जब P_C में कहा जाता है तो / dev / urandom की यादृच्छिकता इतनी यादृच्छिक नहीं लगती है। यह चित्र 2 छवियों में से बना है, लेकिन यह चुनना आसान है कि अतिरिक्त 2 पंक्तियों का पैटर्न हमेशा एक जैसा होता है यानी यादृच्छिकता प्रत्येक दर्ज कुंजी के साथ उत्पन्न नहीं होती है, लेकिन प्रत्येक दो पंक्तियों के लिए केवल एक समय - संभवतः केवल पहला समय .bashrc द्वारा पढ़ा जाता है bash
  • PS1 चर की सामग्री के साथ शुरू होता है $(echo -en '\n') $(tput setab 4)- अच्छी तरह से बीच में उस स्थान, $ (tput ...) से पहले, यह काम करने के लिए वहाँ होना चाहिए। अन्यथा ब्लू लाइन प्रॉम्प्ट के ऊपर दिखाई देती है और उसके सामने नहीं और मैं इसका समाधान नहीं कर सकता। और यह हैक वह है जो अपना नाम 0.2 देता है। :)

0.3 - tput cuuऔरtput cud

for i in $(seq 1 $(expr $(tput lines))); do echo -en '\E[0;32m'$(tr -dc '",.o;:~' < /dev/urandom | head -c $(tput cols)); done; tput cup 1

PROMPT_COMMAND="echo -en '\033[0;32m$(tr -dc ',;o.:~' < /dev/urandom | head -c $(tput cols))\n\033[36;44m$(tr -dc '~' < /dev/urandom | head -c $(tput cols))\033[0;32m$(tr -dc ',.o+;:~' < /dev/urandom | head -c $(tput cols))'$(tput cuu 2)"

PS1="\[\033[0m\] \[\033[1;32m\][1]\[\033[7;32m\]=2=:\W)\[\033[0;32m\]=3=\[\033[1;32m\]=4=@>\[\033[0;32m\]"

PROMPT_COMMAND के साथ जो किया जाता है वह यह है कि प्रॉम्प्ट जेनरेट होने से पहले हर बार पैटर्न की 3 लाइनें प्रिंट की जाती हैं - और उन 3 सेट पैटर्न को व्यक्तिगत रूप से 0.2 में बताई गई बाधाओं के भीतर उत्पन्न होता है - पानी के लिए अर्थहीन क्योंकि यह 1 char है लेकिन फिर भी। फिर हम दो पंक्तियों का उपयोग करते हुए ऊपर जाते हैं tput cuu 2और PS1 के अनुसार मध्य रेखा पर संकेत उत्पन्न होता है। हमारे पास अभी भी .bashrc लोड पर पूर्ण स्क्रीन पैटर्न के लिए कमांड का हमारा प्रारंभिक सेट है जो टर्मिनल पर लॉग इन करते समय केवल एक बार निष्पादित होता है। अब हमारे पास सक्रिय लाइन के आसपास कुछ पैडिंग है जिसका अपना नीला पैटर्न है जो हमेशा वापसी गाड़ी होने पर दोहराया जाता है। PS1 चर और P_C की सामग्री को पवित्रा किया गया है। भागने के अनुक्रम और रंग कोडिंग के वाक्यविन्यास लंबे समय के भीतर एम्बेडेड होते हैंechoअनुक्रम मुश्किल हो सकता है। त्रुटियां अजीब टर्मिनल व्यवहार को जन्म देती हैंएक दूसरे को अधिलेखित करने वाली पंक्तियों सहित, एक प्रॉम्प्ट जो बाएं मार्जिन या असामान्य आउटपुट से दूर सामान के लिए दिखाई देता है जिसे अनायास ही संसाधित किया गया है। एक स्थिति यह है कि मैं क्या कर रहा हूं, जहां मेरे सेटअप (आर्क बैंग) के साथ लिनक्स टर्मिनल और lxterm के बीच एक दृश्य अंतर का सामना करने के लिए PS1 चर के अंदर एक अतिरिक्त स्थान की आवश्यकता है। अतिरिक्त स्थान के बिना, लिनक्स टर्मिनल किसी कारण के लिए अंतिम पंक्ति के अंत में प्रॉम्प्ट के पहले चरित्र को प्रिंट करता है किसी कारण से मैं यह पता नहीं लगा सकता (निश्चित रूप से यह ऐसा कुछ है जो मैं करता हूं और डिफ़ॉल्ट व्यवहार नहीं)। यह भी पता नहीं लगाया जा सकता है कि उद्धरण चिह्नों में चार सेट के लिए कुछ यादृच्छिक प्रभाव (बोल्ड, उलटा आदि) कैसे उत्पन्न किया जाता है, क्योंकि यह प्रदर्शन बढ़ाने के लिए लंबे समय तक तार उत्पन्न करने के लिए जल्दी तय किया गया था।

टर्मिनल खुलने पर प्रारंभिक पैटर्न यहाँ छवि विवरण दर्ज करें

एक के बाद व्यवहार clearऔर दबाने पर तुरंत क्रम में प्रवेश करते हैं यहाँ छवि विवरण दर्ज करें

टिप्पणियों

  • थोक में इसे करने से परे पैटर्न को रंग देने के लिए लागू करने के लिए पुन: डिज़ाइन या संशोधित किया जाना चाहिए
  • यह महसूस करना शुरू करना कि बहुत आगे जाना या तो सभी को एक स्क्रिप्ट में डालना होगा या अमूर्तता के कुछ उच्च रूप का लाभ उठाना होगा। लेकिन अंतिम उपयोगकर्ता के लिए टर्मिनल क्षमताएं काफी सक्षम हैं (मुझे "लोगो" की याद दिलाती हैं)!

20
मैं थोड़ा भयभीत हूं कि आप ऐसा करना चाहते हैं :-)
क्रिस डाउन

2
@ क्रिस डाउन के रूप में मैं क्यू पूरा करने के बाद वास्तव में था, इतना तो मैंने लगभग पोस्ट नहीं किया;) यह अज्ञात है लेकिन मेरा मानना ​​है कि एक उत्तर कुछ जानकारी को कैसे टर्मिनल में प्रदर्शित कर सकता है और क्या यह विन्यास से परे है और सॉफ्टवेयर के पुन: प्रयोजन में या नहीं। और छुट्टी का मौसम मुझे लगता है!

3
मैं थोड़ा घबराया हुआ हूं, लेकिन मुझे नहीं लगता कि इसमें कुछ भी गलत है। मैंने अपने अतीत में बहुत से भयानक काम किए हैं, लेकिन अत्याचारों को पूरा करने की कोशिश करते हुए, मैंने काफी कुछ सीखा है। प्लस जो एक व्यक्ति सोचता है कि पागल है, दूसरा व्यक्ति नहीं हो सकता है। यह एक अच्छी चुनौती की तरह लगता है, इसके लिए जाएं :-)
पैट्रिक

क्या आप इसे एक टेक्स्ट-मोड कंसोल या एक फ़्रेमबफ़र पर पूरा करने की कोशिश कर रहे हैं? या शायद आप भी xterm का समर्थन करना चाहते हैं?
रुस्लान

@Ruslan शायद पूर्णता के लिए दोनों? मैं देखता हूं कि एसडीएल फ्रेमबफ़र का उपयोग करता है जिससे मैं समझ लेता हूं और जिस खेल को मैंने संदर्भित किया है वह इस ढांचे का उपयोग करता है। दूसरी तरफ मेरा सवाल टर्मिनल फ्रेमवर्क के क्लासिक इंटर्नल्स को दर्शाने के लिए है जो मुझे लगता है। जब बैश को अनुकूलित किया जाता है और अग्रभूमि तत्वों को bash.bashrc के साथ बदल दिया जाता है, तो फ़्रेमबफ़र का सहारा नहीं लिया जाता है, इसलिए मुझे "कुछ ऐसा है जो पाठ पर काम करता है" में रुचि रखता है या फिर अन्य तरीके से इसे लागू किया जाता है, जैसा कि अक्षम या भोला हो सकता है। हो। के रूप में xterm के लिए, अच्छी तरह से शुरू में मेरा मतलब एक समाधान था जो X पर भरोसा नहीं करता है।

जवाबों:


6

0.5 ए - सियान टम्बलवीड मैदान

प्रश्न के साथ प्रदान किए गए पहले के कार्यान्वयन, कमांड के एक क्रम पर निर्भर करते हैं जो trएकल बाइट वर्णों का उपयोग करता है और सेट करता है । जैसा कि इस प्रश्नोत्तर में समझाया गया था , उपयोगिता यूनीकोड ​​जैसे मल्टीबाइट वर्णों को संसाधित नहीं कर सकती है। लेकिन वांछित प्रभाव को प्राप्त करने में उन पात्रों का लाभ उठाना काफी आवश्यक था। एक "समाधान" प्रदान किया गया था जो एकल बाइट और मल्टी बाइट चार्ट को एक ही स्ट्रीम में प्रस्तुत करने के लिए मिश्रण करने की अनुमति देता है। वहां विकसित समाधान प्रस्तुत और अनुकूलित किया गया है:

Z1=$(echo -en '\xe2\x97\x98') #◘ 1
Z2=$(echo -en '\xe2\x95\x9a') #╚ 2
Z3=$(echo -en '\xe2\x95\x9c') #╜ 3
Z4=$(echo -en '\xe2\x95\x9d') #╝ 4
Z5=$(echo -en '\xe2\x95\x9e') #╞ 5
Z6=$(echo -en '\xe2\x95\x9f') #╟ 6
Z7=$(echo -en '\xe2\x96\x91') #░ 7
Z8=$(echo -en '\xe2\x96\x92') #▒ 8
Z9=$(echo -en '\xe2\x96\x93') #▓ 9
N1=$(echo -en '\xe2\x94\x80') #─ a
N2=$(echo -en '\xe2\x95\x92') #╒ b
N3=$(echo -en '\xe2\x95\x97') #╗ c
N4=$(echo -en '\xe2\x96\xb6') #▶d
N5=$(echo -en '\xe2\x94\xbc') #┼ e
N6=$(echo -en '\xe2\x94\xa4') #┤ f
N7=$(echo -en '\xe2\x95\xa1') #╡ g
Z11="$(tr -dc '123456789a' < /dev/urandom | head -c 1)" //Z11 to Z13 not
Z12="$(tr -dc '123456789a' < /dev/urandom | head -c 1)" // used here (see
Z13="$(tr -dc '123456789a' < /dev/urandom | head -c 1)" //link)

echo -en $(tr -dcs ' ;",15bdef' ' ' < /dev/urandom | head -c $(echo -en "$[$(tput cols) * $(tput lines)]") | sed -e "s/1/$(echo -en "\033[0;36m$Z1\033[0m")/g" -e "s/5/$(echo -en "\033[0;32m$Z5\033[0m")/g" -e "s/b/$(echo -en "\033[1;36m$N2\033[0m")/g" -e "s/d/$(echo -en "\033[1;36m$N4\033[0m")/g" -e "s/e/$(echo -en "\033[0;32m$N5\033[1;32m")/g" -e "s/f/$(echo -en "\033[0;36m$N7\033[1;32m")/g"); tput cup 1
                 ^set^+^chars^ to implement from pool - here 1,5,b,d,e,f... so_________________________^add the appropriate sed subprocessing units for implemented chars i.e. first one we replace "1" with the value of $Z1 and apply color at the same time, then all the chars move down the pipe to all required blocks - we selected to implement 6 chars here so we have 6 sed blocks. 

[N.B. To remove the blank space from the pattern, remove it from both sets: tr -dcs ';",15bdef' '']

PS1="\[\033[1;36m\] $(echo -en '\xe2\x96\x91')$(echo -en '\xe2\x96\x92')$(echo -en '\xe2\x96\x93')[\t]$(echo -en '\xe2\x96\x93')$(echo -en '\xe2\x96\x92')$(echo -en '\xe2\x96\x91') \[\033[7;36m\]$(echo -en '\xe2\x97\x98')$(echo -en '\xe2\x94\xbc')$(echo -en '\xe2\x94\x80')\W$(echo -en '\xe2\x94\x80')\[\033[0;36m\]$(echo -en '\xe2\x94\x80')$(echo -en '\xe2\x94\x80')$(echo -en '\xe2\x94\x80')@$(echo -en '\xe2\x96\xb6')\[\033[0;36m\]"

PROMPT_COMMAND="echo -en '\033[0;36m$(tr -dc '=' < /dev/urandom | head -c $(tput cols))\n\033[01;46m$(tr -dc '~' < /dev/urandom | head -c $(tput cols))\033[0;36m$(tr -dc '=' < /dev/urandom | head -c $(tput cols))'$(tput cuu 2)"

यह कार्यान्वयन अब प्रति पंक्ति प्रस्तुत नहीं करता है, बल्कि sedप्रसंस्करण के अंत में एक शॉट में पूरे अनुक्रम को प्रिंट करता है । यह केवल एक बार या आमतौर पर bashलॉन्च होने पर लॉगिन पर दिखाई देता है। यहां लॉन्च के समय एक ऐसा रैंडम पैटर्न है (हम हरे रंग के दो और सियान के दो रंगों को देख सकते हैं)

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

स्क्रीन मानक लिनक्स टर्मिनल में परिणाम दिखाते हैं और यह xterm में भी काम करता है। मैंने PS1 प्रॉम्प्ट में उन कुछ नए पैटर्न चार्ट का उपयोग किया है जबकि PROMPT_COMMAND सिर्फ सक्रिय लाइन और इसके 2 लाइन पैडिंग का ध्यान रखता है जो 1 बाइट चार्ट का उपयोग करते हैं।

पैटर्न भी अच्छी तरह से मेरे वर्तमान वितरण जो कॉल से मेल खाता है archbey.bashrc में .:

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

यह क्रिसमस के लिए है! लोगों को खुश करना :)


1
यह एक निश्चित जवाब या कार्यान्वयन नहीं है, लेकिन यह एक मील का पत्थर है! ;-)

यह भी संभव हो सकता है कि एक पुस्तकालय की शक्ति का लाभ उठाएं - जैसे कि गर्म परिचय के aafireलिए उदाहरण के aafire -driver curses -extended -gamma 1 -floyd_steinberg -random 5लिए।

इस उत्तर को याद न करें जो यहां चर्चा की गई utf8 एन्कोडेड यूनिकोड सीमा से निपटती है !!

4

प्रदर्शन द्वारा किया जाता है टर्मिनल एक सॉफ्टवेयर है जो एक वेब ब्राउज़र के रूप में ही काम करता है: यह व्याख्या चरित्र दृश्यों प्रदर्शन स्थापित करने के लिए (देखें आदमी terminfo )। बैश शेल टर्मिनल को यह नहीं बताएगा कि स्क्रीन के खाली क्षेत्र को कैसे भरना है।

कुछ टर्मिनलों में पृष्ठभूमि के समान चित्र होते हैं, लेकिन यह शेल द्वारा नहीं बनाया जाता है।


मैंने क्यू को जल्दी से समझाने के लिए संपादित किया है कि आप क्या टिप्पणी के साथ-साथ अन्य प्रासंगिक जानकारी को छिपाए गए हैं।
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.