त्वरित अपहरण के बिना एक पृष्ठभूमि प्रक्रिया से प्रगति की गूंज


10

सरल स्क्रिप्ट पर विचार करें hello:

#!/bin/bash

echo 'hello world!'

अब अगर मैं बैकग्राउंड में इसे चलाने की कोशिश करता हूं तो बैश से:

$ hello &
[1] 12345
$ hello world!
 <--- prompt is stuck here until I hit enter!
[1]+ Done
$  <--- prompt back to normal

मैं क्या देखूंगा:

$ hello &
[1] 12345
[1]+ hello world!
[1]+ Done
$  <--- prompt normal the whole time

मैं व्यवहार को कैसे बदल सकता हूं?

जवाबों:


13

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

आप एक स्क्रिप्ट के साथ प्रयोग करना चाहते हैं जो शुरू होता है sleep 3और स्क्रिप्ट को पृष्ठभूमि में लॉन्च करने के बाद टाइप करना शुरू कर देता है, यह देखने के लिए कि आप किस गति से हो रहे हैं।

जब आप बैकग्राउंड जॉब को notifyविकल्प के साथ सेट करके समाप्त करते हैं, तो आप तुरंत बैश कर सकते हैं set -b। फिर आप देखेंगे:

$ set -b
$ hello &
[1] 12345
$ hello world!
[1]+ Done

बैश इस मामले में संकेत नहीं देता है। आप अभी भी उस प्रॉम्प्ट लाइन पर कमांड लाइन का संपादन कर रहे हैं जो पृष्ठभूमि की नौकरी छपने से पहले दिखाई देती है hello world!। आप वर्तमान लाइन को Esc 1 Ctrl+ दबाकर फिर से तैयार कर सकते हैं L। आप कमांड redraw-current-lineको अधिक सुविधाजनक कुंजी से बांधना चाह सकते हैं ; उदाहरण के लिए, के लिए Ctrl+ Lवर्तमान पंक्ति पुनः बनाने और Ctrl+ Alt+ Lस्क्रीन साफ करें, अपना निम्न पंक्तियां जोड़ें ~/.inputrc:

"\C-l": redraw-current-line
"\e\C-l": clear-screen

मुझे प्रॉम्प्ट लाइन को स्वचालित रूप से बैश बनाने का एक तरीका नहीं पता है। Zsh डिफ़ॉल्ट रूप से करता है।

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