मैं पृष्ठभूमि में जारी रखने के लिए Ctrl-Z और bg को एक कुंजी में कैसे कर सकता हूं?


24

मैं कार्य को निलंबित करने के इस पैटर्न का पालन करता हूं और फिर इसे Ctrl-Z bgअनुक्रम के साथ अक्सर जारी रखने देता हूं ।

मैं सोच रहा था कि वहाँ किसी भी कुंजी को संपीड़ित करने का कोई तरीका है?

मेरा खोल है zsh


मैं कहना चाहता हूं कि शायद कठिन कोडित है। लेकिन मैं १००% नहीं हूँ
चाड हैरिसन

यकीन है कि यह है, लेकिन मैं सुंदर समाधान मिल गया है, शुक्रिया superuser.com/a/161922/35223
एवगेनी Dolzhenko

जवाबों:


24

Ctrl+ Zअनुक्रम, टर्मिनल द्वारा नियंत्रित किया जाता खोल से नहीं। (उपयोगी पृष्ठभूमि:, टर्मिनल ’,, शेल’, and ट्टी ’और is कंसोल’ के बीच सटीक अंतर क्या है? )

केवल एक छोटा, गैर-एक्स्टेंसिबल सेट फ़ंक्शंस टर्मिनल में एक कुंजी के लिए बाध्य हो सकता है । आप इन फ़ंक्शन से जुड़ी कुंजियों को कस्टमाइज़ कर सकते हैं , लेकिन दूसरे फ़ंक्शन को नहीं जोड़ सकते। ये कार्य तीन श्रेणियों में आते हैं:

  • कार्यक्रमों में कमांड लाइन संस्करण है कि उनके अपने प्रदान नहीं करते हैं (प्रामाणिक मोड, भी पकाया बुलाया मोड () कच्चे मोड के साथ विपक्ष, जो आप शायद ही कभी व्यवहार में इस्तेमाल करेंगे द्वारा): फ़ाइल (के अंत eof, Ctrl+ D), पंक्ति के अंत ( eol, Ctrl+ M), मिटाया वर्ण छोड़ दिया ( erase, Ctrl+ H), मिटा शब्द वाम ( werase, Ctrl+ W), मिटा रेखा ( kill, Ctrl+ U)।
  • मैनुअल प्रवाह नियंत्रण: stop( Ctrl+ S), start( Ctrl+ Q)। केवल पुराने धारावाहिक टर्मिनलों पर उपयोगी होते हैं जो टर्मिनल को गिरा देते हैं जब टर्मिनल कंप्यूटर या इसके विपरीत नहीं रख सकता था।
  • सिग्नलिंग: इंटरप्ट ( intr, Ctrl+ C), बल छोड़ना ( quit, Ctrl+ \), सस्पेंड ( Ctrl+ Z)।

लिनक्स सहित कुछ प्रणालियाँ उस सूची का विस्तार करती हैं, लेकिन मैंने कभी ऐसा नहीं देखा जिसमें पृष्ठभूमि शामिल हो। ध्यान दें कि यह कर्नेल में टर्मिनल ड्राइवर और टर्मिनल एमुलेटर में दोनों का समर्थन करेगा। तो आपको सस्पेंड करना होगा, जो अग्रभूमि नौकरी को SIGTSTP सिग्नल भेजता है । यह अग्रगामी नौकरी के नेता की मूल प्रक्रिया में एक SIGCHLD को ट्रिगर करता है , जो आमतौर पर शेल है। जब शेल को SIGCHLD प्राप्त हुआ, तो यह waitpidपता लगाने के लिए कॉल किया गया कि इसे क्यों अधिसूचित किया गया था, और यह पता लगाने पर कि पृष्ठभूमि की नौकरी निलंबित कर दी गई थी, यह एक अधिसूचना (जैसे [1] + 12345 suspended mycommand) और एक नया संकेत प्रदर्शित करता है ।

आप SIGCONTअग्रभूमि नौकरी के लिए एक संकेत भेजने के लिए शेल को प्रोग्राम कर सकते हैं । मुझे नहीं लगता कि zsh के पास इसके लिए एक हुक है, आपको स्रोत कोड को पैच करना होगा। और zsh के लिए यह जानने का कोई तरीका नहीं है कि क्या आप वास्तव में प्रोग्राम को बाधित करना चाहते हैं (उफ़, यह प्रोग्राम गलत काम कर सकता है, मुझे इसे सॉल्व करते समय सस्पेंड कर देना चाहिए) या बैकग्राउंड करने के लिए।


वर्तमान नौकरी ( ) की पृष्ठभूमि के लिए मैं जोश में Ctrl+ Zकुंजी अनुक्रम सेट करना चाहता हूं %%। इस तरह, मैं Ctrl+ Z Ctrl+ दबाकर अग्रभूमि नौकरी को पृष्ठभूमि पर भेज सकता हूं Z। मैं इसे पर हूँ, वहीं मैं Ctrl+ Zकिसी और उपयोगी कुछ करना जब वर्तमान इनपुट लाइन खाली (तो मैं बस एक उपप्रक्रिया से वापस नहीं आया है) नहीं है: "निलंबित" वर्तमान इनपुट लाइन, मुझे एक और आदेश लिखें करने की इजाजत दी , जिसके बाद बाधित लाइन को इनपुट बफर में वापस धकेल दिया जाता है।

fancy-ctrl-z () {
  if [[ $#BUFFER -eq 0 ]]; then
    bg
    zle redisplay
  else
    zle push-input
  fi
}
zle -N fancy-ctrl-z
bindkey '^Z' fancy-ctrl-z

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

2

^ z ^ z जैसे zsh ऊपर संभव है बैश में, हालांकि यह थोड़ा टेढ़ा है और मैंने इसे लंबे समय तक नहीं चलाया है:

  • आपके .inputrc में मैपिंग शामिल है "\C-z": "bg\n"
  • PS0 बैश वैरिएबल में `$ (स्टटी संदिग्ध ^ z)’ शामिल हैं
  • PROMPT_COMMAND बैश वैरिएबल में 'स्टिकी संदिग्ध ^ @' शामिल हैं

इसलिए ^ सस्पेंड के लिए z चालू है जब एक कमांड चलाया जाता है, तो बैश प्रॉम्प्ट के लिए बंद हो जाता है।


1

तो समाधान मिल गया है, न कि मैं जो चाहता हूँ, लेकिन यहाँ से पास होना चाहिए https://superuser.com/a/161922/35223

खाली कमांड लाइन पर bg चलता है (ताकि Ctrl + Z Ctrl + Z एक प्रोग्राम को स्थगित कर दे और तुरंत पृष्ठभूमि में फिर से शुरू हो जाए)।


मैं ध्यान दूंगा कि इसके लिए zsh की आवश्यकता है; यह बैश में समर्थित नहीं है। (बॉक्स से बाहर, वैसे भी)
केविन एम

@KevinM आप बैश में एक अनुरूप समारोह लिख सकते हैं (कम से कम मूल संस्करण बनाने Ctrl+Zकॉल bg, मैं एक गैर खाली इनपुट लाइन का पता लगाने के बारे में निश्चित नहीं हूँ)।
गिल्स

0

क्या ये कमांड्स हैं जो आप शुरू में अग्रभूमि में चलाना चाहते थे, और फिर पृष्ठभूमि पर स्विच करें? मुझे नहीं पता कि ऐसा करने का कोई सरल तरीका है या नहीं। लेकिन अगर आप ऐसी कमांड्स चलाना चाहते हैं जो पृष्ठभूमि के साथ शुरू होंगी, तो आप बस लाइन के अंत में एक एम्परसेंड जोड़ सकते हैं। जैसे, ping google.com &पृष्ठभूमि में पिंग करना शुरू कर देंगे; जब तक आप टाइप नहीं करेंगे तब तक आप इसके साथ बातचीत नहीं कर पाएंगे fg


1
धन्यवाद, समस्या यह है कि कभी-कभी आपको इस बात का अंदाजा नहीं होता है कि कमांड को चलाने में कितना समय लगेगा, इसलिए आप अंतःक्रियात्मक रूप से दौड़ते हैं और फिर आपको यह एहसास दिलाते हैं कि यह पृष्ठभूमि पर जारी रहेगा। स्वीकृत उत्तर मेरे लिए चमत्कार का काम करता है, इसे दैनिक उपयोग करते हुए!
इवगेनी डोलजेनको

जवाब के लिए धन्यवाद। स्वीकृत उत्तर बहुत साफ है!
अष्टक
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.