बश में विलंबित सस्पेंड (Ctrl-Y) का उद्देश्य क्या है?


30

बैश मैन पेज का पूरा हिस्सा जो केवल लागू होता है, कहता है:

यदि ऑपरेटिंग सिस्टम जिस पर बैश चल रहा है, नौकरी नियंत्रण का समर्थन करता है, तो बैश में इसका उपयोग करने की सुविधाएं हैं। सस्पेंड कैरेक्टर टाइप करना (आमतौर पर ^ Z, कंट्रोल-जेड) जब एक प्रक्रिया चल रही होती है तो उस प्रक्रिया को रोक दिया जाता है और बैश करने के लिए कंट्रोल लौटा देता है। विलंबित निलंबित चरित्र टाइप करना (आमतौर पर ^ Y, कंट्रोल-वाई) प्रक्रिया को रोक देता है जब यह टर्मिनल से इनपुट पढ़ने का प्रयास करता है, और नियंत्रण को बैश में लौटाया जाता है। उपयोगकर्ता इस कार्य की स्थिति में हेरफेर कर सकता bg है, पृष्ठभूमि में इसे जारी रखने के लिए कमांड का उपयोग कर सकता हैfgइसे अग्रभूमि में जारी रखने के लिए, या इसे मारने के लिए मारने की आज्ञा दें। A ^ Z तुरंत प्रभाव डालता है, और लंबित आउटपुट और टाइप-हेड को छोड़ने का अतिरिक्त दुष्प्रभाव होता है।

मैंने कभी उपयोग नहीं किया है Ctrl- Y; मैंने केवल इसके बारे में सीखा है। मैंने केवल ( Ctrl- Z) सस्पेंड किया है ।

मुझे लगता है कि क्या इस विकल्प है कोशिश कर रहा हूँ के लिए । यह कब उपयोगी होगा?

(ध्यान दें कि यह सुविधा सभी यूनिक्स वेरिएंट पर मौजूद नहीं है। यह सोलारिस और फ्रीबीएसडी पर मौजूद है, लेकिन लिनक्स पर नहीं है। यह संगत सेटिंग है stty dsusp।)

शायद कम आत्मगत: कुछ ऐसा है जिसे साथ पूरा किया जा सकता है Ctrl- Yउस के साथ बस के रूप में आसानी से पूरा नहीं किया जा सकता है Ctrl- Z?


@ गिल्स, हालांकि FreeBSD को लगता है कि stty dsusp, मैं इसे Y (मैं सोलारिस पर किया था) पर SIGTSTP भेजने में कामयाब नहीं हुआ हूं। क्या तुम?
स्टीफन चेजलस

जवाबों:


23

CBS के लिए 4BSD मैनुअल से :

A ^Zतुरंत प्रभाव डालता है और उस लंबित आउटपुट में एक बाधा की तरह होता है और टाइप किए जाने पर अपठित इनपुट को छोड़ दिया जाता है। एक और विशेष कुंजी है ^Yजो एक STOP सिग्नल उत्पन्न नहीं करती है जब तक कि कोई प्रोग्राम इसे (2) पढ़ने का प्रयास नहीं करता है। यह उपयोगी रूप से आगे टाइप किया जा सकता है जब आपने एक नौकरी के लिए कुछ कमांड तैयार किए हों जिसे आप उन्हें पढ़ने के बाद रोकना चाहते हैं।

इसलिए, इसका उद्देश्य कई इनपुट टाइप करना है जबकि पहले एक को संसाधित किया जा रहा है, और काम पूरा होने के बाद उन्हें रोकना है।


यह विवरण बैश मैनुअल से बिल्कुल अलग है। "... एक बंद संकेत उत्पन्न करता है नहीं जब तक एक कार्यक्रम के प्रयास को पढ़ने के लिए यह। " यह स्ट्रीम इनपुट में सब कुछ की तरह लगता है अप करने के लिए^Y सफलतापूर्वक पढ़ा जाएगा, और फिर जब ^Yमारा जाता है प्रक्रिया रोक दिया जाएगा। क्या मेरे द्वारा इसे सही से पढ़ा जा रहा है?
वाइल्डकार्ड

@ मैक ओएस एक्स पर मेरे परीक्षण में सॉइलकार्ड, पढ़ने से पहले प्रक्रिया को रोक दिया जाता है () (लेकिन पढ़ने के लिए कॉल के बाद (जो कि वाई रन लौटा होता है )), और इसे फिर से शुरू करने के बाद ^ वाई से इनपुट प्राप्त होता है । मुझे लगता है कि इसका उपयोग करने का इरादा था, हालांकि, इसका उपयोग एक लाइन की शुरुआत में किया जाएगा, इसलिए इस मामले में व्यवहार कोई फर्क नहीं पड़ेगा। मुझे संदेह है कि वास्तविक कोड में, इसे निलंबित कर दिया जाता है जब ^ Y को पढ़ने वाले उपयोगकर्ता प्रक्रिया में कॉपी किया जाता था।
रैंडम 832

मैं सही था, मूल BSD कर्नेल के ttread फ़ंक्शन में आप इसे देख सकते हैं, और आधुनिक OSX
random832

लेकिन, जब प्रक्रिया फिर से शुरू की जाती है, तो कॉल सफल हो जाएगी और आपके द्वारा अपने टर्मिनल में टाइप किया गया डेटा शामिल हो जाएगा ^Y, भले ही आपने प्रक्रिया को अस्वीकार कर दिया हो और प्रक्रिया फिर से शुरू होने से पहले अपने टर्मिनल को बंद कर दिया हो। सही? ( "... इसके फिर से शुरू होने के बाद यह ^ Y से पहले इनपुट प्राप्त करता है।" यही मेरा मतलब है; मैं आमतौर पर सी कोड में नहीं है।) :)
वाइल्डकार्ड

हाँ। और यह अंत में एक नई रेखा के बिना लौटता है, जो विहित मोड में पढ़ने के लिए असामान्य है [इसी तरह यदि आप कुछ पाठ टाइप करते हैं और फिर ^ डी एक बार दबाया जाता है] मुझे संदेह है कि उन्होंने इस मामले के बारे में बहुत सोचा नहीं था, क्योंकि यह वास्तव में एक पंक्ति की शुरुआत में टाइप करने का इरादा है।
रैंडम 832

11

कहते हैं कि एक लूप रीडिंग इनपुट और निष्पादन है। कार्य को वर्तमान निर्देश को पूरा करने देने के लिए उपयोगी हो सकता है, एक नए के लिए कमांड लाइन पर वापस जाने से पहले इसे बाधित किए बिना। तो इस प्रकार एक चक्र समाप्त होता है। यह लूप को इनायत से समाप्त करता है और readटाइमआउट प्रतिबंध के तहत इसे फिर से चलने से रोकता है ।


लेकिन अगर यह वैसे भी टर्मिनल से इनपुट पढ़ने की कोशिश करने जा रहा है, तो यह उस बिंदु पर बंद हो जाएगा (और आपके इनपुट की प्रतीक्षा करें), और आप ^Zइसे तब कर सकते हैं ।
वाइल्डकार्ड

हाँ। अपडेट देखें
टॉमाज़

एक और जांचें। @Wildcard
टोमाज़

1
लेकिन अगर यह समय समाप्त हो गया है, तो क्या यह सिर्फ इनायत से खत्म नहीं होगा अगर आपने कुछ खास नहीं किया?
डैनियल वैगनर

1
ये हो सकता है। लेकिन यह भी जा सकता है और कुछ डिफ़ॉल्ट काम कर सकता है।
टॉमाज़

4

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

मान लीजिए कि आप एक ऐसी स्क्रिप्ट डिबग कर रहे हैं, जो अस्थायी फ़ाइलों को लिख रही है, जिन्हें आप क्लीन-अप रूटीन के हिस्से के रूप में हटाने से पहले विश्लेषण करना चाहते हैं।

read fooफ़ाइलों के लिखे जाने के बाद (लेकिन सफाई से पहले) आप स्क्रिप्ट को चलाने के बाद कहीं जोड़ सकते हैं , और दबाएं Ctrl- Yजैसे वे उत्पन्न हो रहे हैं। फिर आपको पृष्ठभूमि में निलंबित स्क्रिप्ट के साथ प्रॉम्प्ट करने के लिए छोड़ दिया जाएगा जो आपको करने की आवश्यकता है, और फिर fgस्क्रिप्ट को पूरा करने की अनुमति दे सकता है ।


1
संभावना नहीं लगती है, क्योंकि स्क्रिप्ट वैसे भी इनपुट की प्रतीक्षा करेगी। तो आप इसे आसानी से इनपुट के लिए संकेत देने के लिए आसानी से देख सकते हैं और फिर इसे स्थगित कर सकते हैं ^Z। दूसरे शब्दों में: आप टाइप करने के बाद fgआप स्क्रिप्ट कुछ इनपुट देना होगा वैसे भी इससे पहले कि यह जारी रहेगा। इसलिए मेरा प्रश्न; मैं अभी भी नहीं देख रहा हूँ ^Y। (जवाब देने के लिए धन्यवाद, हालांकि!) :)
वाइल्डकार्ड

2

एकमात्र परिदृश्य जिसके बारे में मैं सोच सकता हूं (और यहां तक ​​कि मुझे यह बहुत पक्का नहीं लगता), यदि आप शेल कमांड के लिए कुछ टाइप-फॉरवर्ड का उपयोग करना चाहते हैं। कहते हैं कि कुछ कमांड चल रही है जो भविष्य में कुछ समय इनपुट पढ़ेगी। तब आप ^ इसे कर सकते हैं, और फिर अगले शेल कमांड को तुरंत टाइप करें जिसे आप चलाना चाहते हैं जब रनिंग कमांड सस्पेंड होता है। मुझे नहीं लगता कि बीएसडी यूनिक्स का उपयोग करने के कई दशकों में मैंने कभी इसका इस्तेमाल किया है।

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