जब भी मैं कोई कुंजी दबाऊंगा तो मैं टेक्स्ट को इजाफा करने वाले टॉप स्टॉप को कैसे बता सकता हूं


1

मैं गनोम-टर्मिनल के लिए एक कस्टम स्टार्टअप कमांड लिख रहा हूं, और मेरा इरादा इसे लॉन्च करने पर हर बार एक स्वागत संदेश प्रदर्शित करना है।

संदेश सही तरीके से प्रदर्शित होता है, मैंने अक्षरों को 0.09 के समय में एक-एक करके प्रदर्शित करने के लिए इसे कोडित किया:

echo -n "W" 
sleep 0.09
echo -n "e" 
sleep 0.09
echo -n "l"
sleep 0.09
echo -n "c"
sleep 0.09
echo -n "o"
sleep 0.09 
echo -n "m"
sleep 0.09 
echo -n "e" 
sleep 0.09 

इसका परीक्षण करते समय, मुझे लगा कि अक्षरों को प्रदर्शित होने और शुरू करने से रोकने में सक्षम होना काफी आरामदायक होगा su सीधे। मैं निम्नलिखित समाधान के साथ आया:

su --command "read -n 1 -s key; if [[ "$key" == "g" ]]; then echo "Test Successful."; else echo "Test Failed."; fi;"

मुझे इस्तेमाल करना है su -c अगर मैं नहीं चाहता कि मैं नाराज हो जाऊं और फेंक दूं illegal action: read -n। यह कोड स्निपेट विशेष रूप से डीबगिंग उद्देश्यों के लिए है, क्योंकि मैं यह परीक्षण करना चाहता था कि बैश एक-लाइन कमांड संयोजन को कैसे पढ़ता है।

मुख्य समस्या तब आती है जब मैं इस कोड को कॉन्फिग फाइल (जहां मैं स्टार्टअप के लिए अपना कस्टम कमांड लिखता हूं) से निष्पादित करने का प्रयास करता हूं। बैश रिटर्न:

No passwd entry for user 'Successful.; else echo Test'
Welcome

रहस्यमय तरीके से, जब मैं एक ही कमांड (बिना) कोशिश करता हूं su -c ) डिफ़ॉल्ट प्रोफ़ाइल में यह पूरी तरह से काम करता है, लेकिन अगर मैं इसे su -c के साथ आज़माता हूं, तो यह नहीं है।

डिफ़ॉल्ट प्रोफ़ाइल में अन्य आदेशों के साथ, मैंने टाइप किया su -c "echo Hi" और ठीक काम किया। ऐसा क्यों हो सकता है? क्या तुम्हारे पास कोई विचार है?

जवाबों:


1

पूरे कमांड को डबल के बजाय सिंगल कोट्स में एनक्लोज करें। पहली बात ध्यान दें कि आपके पास एक चर ($ कुंजी) है। दोहरे उद्धरण चिह्नों में संलग्न, इसे दिए गए तर्क से पहले शेल द्वारा प्रतिस्थापित किया जाएगा su। दूसरी बात बोली से संबंधित है जो आपके पास वर्तमान में है, दोहरे उद्धरण चिह्नों के साथ, तर्क इस तरह विभाजित होगा:

  • arg0: su
  • ARG1: --command
  • aRG2: read -n 1 -s key; if [ <value of $key or nothing> == g ]; then echo Test
  • arg3: Successful.; else echo Test
  • arg4: Failed.; fi;

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

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

निम्नलिखित संस्करण को उम्मीद के मुताबिक काम करना चाहिए।

su --command 'read -n 1 -s key; if [ "$key" == "g" ]; then echo "Test Successful."; else echo "Test Failed."; fi;'

ठीक है, यह काम करता है। आपको बहुत - बहुत धन्यवाद! लेकिन अब मुझे कार्य करने की आवश्यकता है जबकि 'प्रतिध्वनि' काम करती है, जैसे कि यह पृष्ठभूमि में निष्पादित हो रही थी। कोई सुराग?
xvlaze

आप उन आदेशों को पृष्ठभूमि कर सकते हैं जो उन्हें कोष्ठक के साथ घेरते हैं और इसे एक & amp; यदि आप इस दौरान लिखते हैं तो यह डिस्प्ले को गड़बड़ कर सकता है;) पूर्व: (इको फू; स्लीप 1; इको बार) & amp;
Damien

और मुझे क्या करना चाहिए अगर मैं चाहता हूं कि रीड कमांड एक ही समय में गूँज के रूप में काम करे, और अगर मैं कोई कुंजी दबाता हूं तो उन्हें रोक दें? मैंने आपके उत्तर के साथ कोशिश की है, लेकिन यह मुझे उचित परिणाम नहीं दे रहा है। मैं एक सु कमांड में "इको:" टेस्ट ... "को चालू करना चाहूंगा जो गूँज को रोकती है और एक कमांड लाइन शुरू करती है, लेकिन मुझे यह मिलता है:" बैश: टर्मिनल प्रोसेस ग्रुप (3700) सेट नहीं कर सकता: डिवाइस के लिए अनुपयुक्त आईक्लो । कमांड खुद है: "(su --command 'रीड-एन 1-एस कुंजी; यदि [" $ कुंजी "==" जी "]; तो सु; फाई; फाई;') & amp;"
xvlaze
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.