शेल आदेशों में टाइप नहीं करता है, "रीसेट" काम करता है, लेकिन क्या हुआ?


57

मेरी समस्या यह है कि बैश शेल मेरे द्वारा टाइप किए गए पात्रों को दिखाना बंद कर देता है। यह हालांकि आदेशों को पढ़ता है।

मैं काफी बार इस समस्या को लेकर आया हूं और मुझे समझ नहीं आया कि इसके क्या कारण हैं। मुझे पता है कि इसे कैसे हल करना है, लेकिन मुझे वास्तव में यह पसंद नहीं है जब मैं समस्याओं से बाहर निकलने का अपना तरीका "वूडूइंग" कर रहा हूं।

मैं इस समस्या के दो तरीकों का वर्णन करूँगा:

मैं एक निश्चित प्रक्रिया चला रहा हूं, http://pythonpaste.org/script/ और कभी-कभी जब मैं उसे रोकता हूं या नियंत्रण टूट जाता है तो उसे वापस शेल में दिया जाता है। जब मैं जाता हूं और शेल में कमांड टाइप करता हूं, तो जो अक्षर मैं टाइप करता हूं वह दिखाई नहीं देता है। जब मैं प्रेस करता हूं तो कमांड सबमिट किए जाते हैं । उदाहरण के लिए:

  • मैं "ls" टाइप करता हूँ
  • मैं केवल एक खाली संकेत देखता हूं और इससे ज्यादा कुछ नहीं
  • मुझे एंटर दबाने और मैं फ़ाइलों की एक सूची दी गई कर रहा हूँ, दूसरे शब्दों में: आदेश है निष्पादित
  • जब मैं "रीसेट" कमांड देता हूं तो शेल फिर से सामान्य रूप से काम करना शुरू कर देता है

दूसरा तरीका ऐसा होता है जब मैं इस तरह से एक कमांड देता हूं:

$ grep foo * -l | xargs vim

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

मेरा अनुमान है कि दोनों समस्याओं का एक अंतर्निहित कारण है, लेकिन मैं इस बात पर अडिग हूं कि यह कारण क्या है या क्या है।

इस समस्या की खोज करना स्वयं समस्याग्रस्त है क्योंकि विवरण अस्पष्ट है और इसके लिए कोई कठिन खोज-शब्द नहीं है।

संपादित करें

दे रहा है

stty --all

जॉन एस। ग्रुबर के अनुरोध के अनुसार कमांड ने निम्न आउटपुट (पठनीयता के लिए संपादित व्हाट्सएप) दिया

speed 0 baud;
rows 53;
columns 186;
line = 0;
intr = <undef>;
quit = <undef>;
erase = <undef>;
kill = <undef>; 
eof = <undef>;
eol = <undef>; 
eol2 = <undef>; 
swtch = <undef>; 
start = <undef>; 
stop = <undef>; 
susp = <undef>;
rprnt = <undef>; 
werase = <undef>; 
lnext = <undef>; 
flush = <undef>; 
min = 0; 
time = 0;
-parenb 
-parodd cs8 
-hupcl 
-cstopb cread 
-clocal 
-crtscts
-ignbrk 
-brkint 
-ignpar 
-parmrk 
-inpck 
-istrip 
-inlcr 
-igncr 
-icrnl 
-ixon 
-ixoff 
-iuclc 
-ixany 
-imaxbel 
-iutf8
-opost 
-olcuc 
-ocrnl 
-onlcr 
-onocr 
-onlret 
-ofill 
-ofdel nl0 cr0 tab0 bs0 vt0 ff0
-isig 
-icanon 
-iexten 
-echo 
-echoe 
-echok 
-echonl 
-noflsh 
-xcase 
-tostop 
-echoprt 
-echoctl 
-echoke

2
जब ऐसा होता है तो कृपया दर्ज करें stty --allऔर अपने प्रश्न में परिणाम डालें । इको एक टटी विशेषता है जिसे बंद किया जा रहा है। विम इसे चलाने के दौरान करेगा, और यह टर्मिनल को कच्चे मोड में भी डाल देगा। जब यह समाप्त हो जाता है तो इसे टर्मिनल सेटिंग्स को स्वयं रीसेट करना चाहिए। जब विम चल रहा है तो आप iकमांड को गूंजना नहीं चाहते, जो एडिटर को इन्सर्ट मोड में डालता है, उदाहरण के लिए। ये सेटिंग्स ट्टी डिवाइस को बताती हैं कि यह कैसे टाइप करना चाहिए जो आप टाइप करते हैं। जबकि विम चल रहा है, यह प्रतिध्वनित होता है कि क्या प्रतिध्वनित होना चाहिए, इत्यादि
जॉन एस ग्रुबर

जब मैं ज़ॉप (सीटीआरएल + सी के साथ) को रोकता हूं तो यह वही लक्षण होता है जब यह अग्रभूमि में चल रहा होता है और मैं एक आईपीडीबी डिबगिंग सत्र में होता हूं।
मार्क वैन लेंट

@MarkvanLent मुझे लगता है कि मुझे वह समस्या भी मिल गई है
Niels Bom

@JohnSGruber मैंने stty --allअपने प्रश्न का आउटपुट जोड़ा है । अग्रिम में धन्यवाद!
नील्स बॉम

जवाबों:


68

शेल या अधिकांश प्रोग्राम को शेल में चलाने के दौरान आप जो कुछ भी टाइप करते हैं, वह कर्नेल के ट्टी सबसिस्टम द्वारा उपयोगकर्ता के टर्मिनल पर वापस आ जाता है। अक्षर, Ctrl + R, Ctrl + Z, आदि को मिटाने के लिए अन्य विशेष हैंडलिंग भी है।

कुछ प्रोग्राम, (विशेष रूप से संपादक) जो कमांड लाइन से चलते हैं, उन्हें इसकी आवश्यकता नहीं है या नहीं चाहिए। इस कारण से वे tty (टर्मिनल) डिवाइस के खिलाफ IOCTL कॉल के साथ कर्नेल को संकेत देते हैं कि वे इस व्यवहार को नहीं चाहते हैं। वे विशेष वर्णों को विशेष चीजें करने के लिए नहीं चाहते हैं। इसके बजाय वे कर्नेल को "कच्चे" मोड के लिए कहते हैं। विशेष रूप से, संपादक की तरह विम विभिन्न "इको सेटिंग्स" को बंद कर देते हैं। यह सब एक कंप्यूटर की सीरियल लाइनों पर वास्तविक tty टर्मिनलों पर लागू होता है, या Alt + Ctrl + F1 पर आभासी टर्मिनलों, या एक GUI के तहत सूक्ति-टर्मिनल जैसे कुछ चलाने पर आपको वास्तव में प्राप्त होने वाले आभासी टर्मिनल।

ऐसे कार्यक्रमों को किसी भी मोड को बदलने की आवश्यकता होती है जिसे वे छोड़ने से पहले उपयोग कर रहे आभासी tty पर बदलते हैं, या तो एक छोड़ दिया संपादक कमांड दर्ज करके या उदाहरण के लिए (Control + C से) संकेत लेकर।

यदि वे इसे ठीक से करने में विफल रहते हैं, तो आपके द्वारा खोजे गए मजाकिया अवस्था में टैटी को छोड़ दिया जाता है। चूंकि प्रोग्राम टर्मिनल को रीसेट करने में विफल हो सकते हैं, resetउपयोगकर्ता को पुनर्प्राप्त करने की अनुमति देने के लिए कमांड लिखा गया था।

मुझे लगता है कि व्यवधान आपके द्वारा चलाए जा रहे अजगर सॉफ्टवेयर के साथ खिलवाड़ कर रहा है। मुझे लगता है कि उस कार्यक्रम को टर्मिनल को रीसेट करने का मौका नहीं मिल रहा है, या बस ऐसा करने में विफल हो रहा है।

विम मामले में, जब मैं आपका उदाहरण चलाता हूं तो आपको वही व्यवहार मिलता है जिसका आप वर्णन करते हैं। मुझे एक संदेश भी दिखाई देता है "विम: वार्निंग: इनपुट एक टर्मिनल से नहीं है" (जब आप रीसेट करते हैं तो यह चला जाता है)। इसका कारण यह है कि खोल से आम तौर पर शुरू नहीं किया जाता है। इसके बजाय 'grep' और 'xargs' कमांड मानक इनपुट का उपयोग कर रहे हैं, आमतौर पर tty से कब्जा कर लिया गया है, greptto से फ़ाइल नामों को पारित करने के प्रयोजनों के लिए xargs

आपके पोस्ट किए गए आउटपुट में stty -aहम "-चो" देख सकते हैं, यह भी पुष्टि करते हैं कि यह समस्या है। यदि आप इस तरह से विम को मारते हैं, तो यह सिग्नल को शालीनता से संभाल नहीं सकता है, तो आप शायद वही समस्या देखेंगे।

समस्या को https://stackoverflow.com/questions/3852616/xargs-with-command-that-open-editor-leaves-shell-in-weird-state पर कहीं और वर्णित किया गया है ।

विम केस का हल xargs से बचने और इसके बजाय उपयोग करने के लिए है:

 vim $(grep foo * -l)

यहाँ फ़ाइलों की सूची शेल द्वारा निर्मित है, जैसा कि xargs द्वारा किया गया था, लेकिन शेल विम को कॉल कर रहा है, जो सीधे ट्टी से जुड़ा हुआ है। चेतावनी संदेश त्रुटि आउटपुट फ़ाइल पर भेजा गया है, और सेट को सही ढंग से सेट करता है और सही तरीके से सेट करता है।

यहाँ अधिक संदर्भ , और एक और दिलचस्प यहाँHttps://stackoverflow.com/questions/8228831/why-does-locate-filename-xargs-vim-cause-strange-terminal-behaviour के जवाब में एक और दिलचस्प समाधान दिया गया है ।


पूरी तरह से स्पष्टीकरण के लिए धन्यवाद। यह काम नहीं करता है इसका पूरा कारण एक बहुत ही गहरे रबिथोल (टीटीआई, आईओएक्टल, आदि) की तरह दिखता है, इसलिए मैं यह नहीं कह सकता कि मैं पूरी तरह से समझता हूं, लेकिन यह अब और नहीं है, इसलिए फिर से धन्यवाद!
नील्स बॉम

पूरा होने के लिए मैं grep foo * -l | vim -समस्याओं के बिना निष्पादित कर सकता हूं । इसलिए मुझे लगता है कि समस्या grep और xargs के साथ नहीं है, बल्कि xargs के साथ है। क्या आप सहमत हैं?
नील्स बॉम

1
यह grep या xargs की समस्या नहीं है। यह इस तथ्य के साथ एक समस्या है कि स्टड अब ट्टी के लिए निर्धारित नहीं है। यह भी विफल रहता है `सच | vi / tmp / afile1। एक संदर्भ में उल्लेख किया गया है कि विम स्टडआउट (अभी भी ट्टी) को स्टड सेट करता है क्योंकि स्टड को इन सीट्यूशन में / dev / null में सेट किया गया है। जब ऐसा होता है कि वीम इको और अन्य सेटिंग्स को याद और रीसेट कर सकता है लेकिन ऐसा नहीं करता है। मुझे लगता है कि यह एक समस्या है।
जॉन एस ग्रुबर

यह बहुत मददगार था क्योंकि मैंने इसमें भाग लिया है। यह बेतरतीब लगा, लेकिन मुझे यकीन था कि जब मैं vi के साथ ऐसा कुछ करने की कोशिश कर रहा था, जो सफाई से बाहर नहीं निकलता था या पाइप का इस्तेमाल नहीं करता था।
माइकल मैथ्यूज

1
धन्यवाद! अंत में यह पता लगा कि ctrl-c के बाद OS X bash पर कैसे रिकवर किया जाए git add -p!
स्टीव जाॅनसन

0

मैं सिस्टम पर एक नया उपयोगकर्ता शुरू करूंगा (मेरा मतलब है कि एक नया स्वच्छ उपयोगकर्ता बनाएं और वहां लॉगिन करें), और देखें कि क्या समस्या है। यदि यह नहीं है - तो यह आपका टर्मिनल या आपकी X11 सेटिंग्स है।


मैंने एक नया उपयोगकर्ता जोड़ा है और इस grep foo * -l | xargs vimकमांड के साथ परीक्षण किया है । समस्या अभी भी मौजूद है। मुझे ठीक से समझ नहीं आ रहा है कि मेरी X11 सेटिंग्स कैसे प्रभावित कर सकती हैं कि मेरा टर्मिनल btw को कैसे प्रभावित करता है। क्या आप इसे विस्तार से समझा सकते हैं? धन्यवाद!
नील्स बॉम
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.