शैल साइकल कीबाइंडिंग


18

मैं SIGKILLवर्तमान अग्रभूमि नौकरी में भेजने के लिए कीबाइंडिंग कैसे सेट कर सकता हूं ? मुझे पहले से ही पता है कि Ctrl+ Cहै SIGINTऔर Ctrl+ \है SIGQUIT। मैं और अधिक गंभीर विकल्प चाहूंगा।

क्या इस बारे में गंभीरता से कुछ भी अस्वीकार्य है?


यह टर्मिनल चालक द्वारा भेजा जाता है, शेल द्वारा नहीं (जो कि आप कार्यक्रम के साथ क्या कर रहे हैं, इस बारे में पूरी तरह से अनजान हैं)।
user1686

आपने निर्दिष्ट शेल को नोट नहीं किया है, जो कि है zshऔर यह तथ्य कि प्रश्न कीबाइंडिंग के बारे में बात करता है। यह एक zshलाइन संपादक को कॉन्फ़िगर करने के बारे में एक प्रश्न है , किसी के टर्मिनल को स्थापित करने के बारे में नहीं।
JdeBP

जवाबों:


27

अस्वीकार्य या नहीं, यह वास्तव में असंभव है:

नियंत्रण + [?] कीबाइंडिंग वास्तव में tty ड्राइवर द्वारा नियंत्रित की जाती है और शेल द्वारा नहीं, क्योंकि जब तक अग्रभूमि में चलने वाली प्रक्रिया होती है, तब तक आपके टर्मिनल के इनपुट और आउटपुट को सीधे प्रक्रिया में भेजा जाएगा। शेल कभी भी आपके कुंजीपटों पर कार्य नहीं कर पाएगा (या देख भी सकता है)।

आप वर्तमान में निर्दिष्ट Ctrl + [?] कुंजी संयोजनों की एक सूची प्राप्त कर सकते हैं stty -a; हालाँकि, केवल intr(SIGINT, आमतौर पर Ctrl + C के लिए बाध्य होता है) quit(SIGQUIT, आमतौर पर Ctrl + \ से बंधा होता है) और susp(SIGSUSP, आमतौर पर Ctrl + Z से बंधा होता है) वास्तविक यूनिक्स संकेतों के अनुरूप होता है। ( kill,उदाहरण के लिए, SIGKILL नहीं भेजता है, लेकिन वर्तमान इनपुट को हटा देता है।)

दुर्भाग्यवश, दो संकेतों में से एक को भेजने का कोई तरीका नहीं है जिसे एक प्रक्रिया (SIGKILL और SIGSTOP) द्वारा अक्षम नहीं किया जा सकता है, इसलिए यदि तीनों में से सभी संकेत का कोई प्रभाव नहीं है, तो आपको किसी अन्य तरीके का उपयोग करना होगा ( अग्रभूमि प्रक्रिया को मारने के लिए एक और शेल)।

(वास्तव में, तीनों संकेतों को पकड़ने के अलावा, अग्रभूमि प्रक्रिया भी विशेष कुंजी संयोजनों को "कच्ची" मोड पर सेट करके अक्षम कर सकती है। SSH ऐसा करता है, उदाहरण के लिए - यह है कि यह कैसे रिले कर सकता है। दूरस्थ होस्ट के लिए स्थानीय रूप से दबाया गया Ctrl + C।)


3

हां, कुछ असाध्य है। आप सीधे से उछाल रहे हैं SIGINTकरने के लिए SIGKILLसंकेत। मेरा सुझाव है, जैसा कि अन्य लोग करते हैं , परमाणु विकल्प को नियोजित करने से पहले SIGHUPया SIGTERMसंकेतों को भेजते हुए देखते हैं । तो फिर यह एक महत्वपूर्ण बंधन के रूप में होने की असावधानी है, जो निश्चित रूप से इसका मतलब है कि यह केवल तभी काम करेगा जब ZLE सक्रिय है और शेल आपको अंतःक्रियात्मक रूप से इनपुट के लिए प्रेरित कर रहा है, न कि जब कमांड चल रहे हैं। (इसके लिए, आपको टर्मिनल को कॉन्फ़िगर करने की आवश्यकता होगी , शेल को नहीं, और टर्मिनल लाइन अनुशासन की आवश्यकता होगी जो कि SIGTERMPOSIX निर्दिष्ट व्यवहार के विस्तार के रूप में भेजने वाले उपकरणों को लागू करता है।)

उस नोट पर, किसी और ने अभी तक नहीं देखा है कि आप शेल लाइन संपादक कीबाइंडिंग के बारे में पूछ रहे हैं, टर्मिनल के बारे में नहीं। अपने प्रश्न के पहले भाग का उत्तर देने के लिए, तब:

आपने "वर्तमान" नौकरी में सिग्नल भेजने के लिए एक शेल फ़ंक्शन सेट किया।

function terminate-current-job() { kill -s TERM %+ ; }

फिर आप एक ZLE उपयोगकर्ता-परिभाषित विजेट का निर्माण करते हैं जो इस शेल फ़ंक्शन को आमंत्रित करता है।

zle -N terminate-current-job terminate-current-job

फिर, अंत में, आप उस विजेट को अपनी पसंद की कुंजी से बांध देते हैं।

bindkey "^/" terminate-current-job

1
मुझे लगता है कि वह वास्तव में लाइन संपादक के बारे में बात नहीं कर रहा है - यदि वह शेल में टाइप कर रहा है, तो कोई रनिंग अग्रभूमि प्रक्रिया नहीं होगी, है ना? शेल वास्तव में कीपेस को कभी नहीं देखेगा यदि कोई अग्रभूमि प्रक्रिया चल रही है और वर्तमान ट्टी से जुड़ी है।
lxgr
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.