zsh टर्मिनल पर इनपुट नहीं कर सकता जब स्टेंट और स्टैडआउट को पाइपिंग के साथ जोड़ा जाता है जिसमें ट्टी आउटपुट होता है


11

व्यवस्था की सूचना:

macOS Sierra 10.12.6
zsh 5.4.2 (x86_64-apple-darwin16.7.0)
GNU bash, version 4.4.12(1)-release (x86_64-apple-darwin16.3.0)

स्क्रॉल करने के लिए उदाहरण तल पर तुम सिर्फ सरलीकृत उदाहरण है कि मैं बनाया करने के लिए खुदाई करने के लिए चाहते हैं।

नोट: मैं एक बड़ा zshउपयोगकर्ता नहीं हूं ।


मैं देख रहा था fzfके लिए कीबाइंडिंग bashऔर zsh

ध्यान दें कि वे दोनों एक चर कमांड कैसे चलाते हैं $(__fzfcmd)__fzfcmdडिफ़ॉल्ट आउटपुट द्वारा fzfstdout और पैरामीटर प्रतिस्थापन केवल fzfआउटपुट से उत्पन्न कमांड ( ) चलाता है ।

bashऔर zshस्क्रिप्ट के बीच एक अंतर यह है कि bashएक आगे के उत्पादन को पाइप करता है, $(__fzfcmd)लेकिन zshएक सरणी के अंदर इसे पकड़ लेता है। मेरा अनुमान एक समस्या के कारण है zshजब आप आगे आउटपुट को पाइप करते हैं fzfजहां आप इनपुट नहीं कर सकते हैं fzfऔर जिस प्रक्रिया को पाइप करते हैं, fzfउसमें कोई स्टड नहीं मिलता है। आपकी एकमात्र पसंद ^Zया है ^C^Cलगता है किसी कारण के लिए प्रक्रिया की पृष्ठभूमि। या हो सकता है कि वे इसे केवल एक सरणी में चाहते थे ताकि वे उस पर चल zle vi-fetch-historyसकेंbashसंस्करण कुंजी में कुछ जादू के साथ बाध्यकारी करता है"\e^": history-expand-line

अब fzfमहत्वपूर्ण नहीं है। ऐसा लगता है कि आपको सिर्फ एक प्रोग्राम की आवश्यकता है जो ttyइस समस्या का कारण बनने के लिए पैरामीटर प्रतिस्थापन द्वारा बुलाया जाए। तो मैं कुछ सरल उदाहरण दिखाऊंगा।

यहां कुछ अन्य कमांड दिए गए हैं जो इस पर आउटपुट करने से ttyइस समस्या का कारण बन सकते हैं zsh:

  • वाइप (रन पाइप के बीच में संपादक)
  • 'vim -' (स्टिम से रीड पढ़ें। वाइप के समान है लेकिन स्टडआउट में आउटपुट नहीं होगा)

नीचे दिए गए उदाहरण में, के हर घटना की जगह vipeके साथ vim -करता है, तो आपको एक अलग स्थापित करने के लिए नहीं करना चाहती। बस याद है कि vim -संपादक सामग्री का उत्पादन नहीं vipeकरता है जैसे स्टडआउट करता है।

उदाहरण:

1) echo 1 | vipe | cat            # works in both bash and zsh
2) echo 1 | $(echo vipe) | cat    # works in bash only. zsh problem with no output until I hit `^C`:
   ^C
   zsh: done                    echo 1 | 
   zsh: suspended (tty output)  $(echo vipe) | 
   zsh: interrupt               cat
   # seems like the process is backgrounded. I can still see it in jobs command

3) cat <(echo 1 | $(echo vipe))   # zsh and bash has the problem. I'm guessing because
                                  # the file isn't finished writing and cat is
                                  # blocking vipe's tty output
                                  # both their `^C` output is just:
   ^C # nothing special, as expected

4) cat < <(echo 1 | $(echo vipe)) # works in both bash and zsh
5) echo 1 | $(echo vipe) > >(cat) # works in both bash and zsh

# The following don't have and input pipe to vipe.
# Type something then send EOF with ^D
6) vipe | cat                     # works for both
7) $(echo vipe) | cat             # works for both

अब, मैं ज्यादातर सोच रहा हूँ कि क्यों 2)के लिए एक समस्या है zshलेकिन नहीं bashऔर क्यों 4)और के 5)लिए समस्या को हल करता है zsh

zshइस समस्या के लिए आवश्यकताओं को ठीक वही लगता है जो मैंने शीर्षक में रखा था:

  • इनपुट पाइप
  • चर / पैरामीटर प्रतिस्थापन द्वारा कमांड चलाया जाता है जिसमें ttyआउटपुट होता है
  • आउटपुट पाइप

अपडेट करें

मैं एक वैकल्पिक हल है कि कारण नहीं है जोड़ा zsh, इस समस्या के लिए 5)। यह समान है, 4)लेकिन इसमें stdoutसीधे रीडायरेक्ट करने के बजाय stin, मैं इसे एक फ़ाइल में रीडायरेक्ट करता हूं जो stdinप्रक्रिया प्रतिस्थापन का उपयोग करके रीडायरेक्ट करता है ।


1
जैसा कि आप का उत्पादन psआपको बताएगा, इनमें से किसी भी मामले में गोले जमे हुए या अटक नहीं रहे हैं। वे सामान्य तरीके से बच्चे की प्रक्रियाओं की प्रतीक्षा कर रहे हैं; और जब वे बाल प्रक्रियाएँ निलंबित या समाप्त हो जाएँगी तो वे वास्तव में सामान्य तरीके से इनपुट के लिए संकेत देना शुरू कर देंगे। आपके प्रश्न शीर्षक और शरीर में एक निहित गलत आधार शामिल है। "मेरा खोल क्यों जमता है?" जब आपके खोल वास्तव में पहले स्थान पर ठंड नहीं है, तो एक अचूक लोडेड प्रश्न है। इस निहित झूठे आधार को हटाने के लिए आपके पास एक बेहतर प्रश्न होगा।
JdeBP

ठीक है, मैं इसे बदल सकता हूं। यह वास्तव में इस अर्थ में जमी नहीं है कि यह प्रक्रिया सीपीयू पर निर्देश चलाने में सक्षम नहीं है। आप सही हैं कि यह अभी इंतजार कर रहा है। लेकिन क्या यह is अटका ’नहीं है? यह इनपुट का इंतजार कर रहा है जो मैं इसे प्रदान करने में सक्षम नहीं हूं। इस संक्षिप्त वर्णन के लिए एक बेहतर शब्द क्या है? क्या यह हैंग के इस विवरण से मेल नहीं खाताwhen either a computer program or system ceases to respond to inputs
dosentmatter

1
शेल इनपुट की प्रतीक्षा नहीं कर रहा है। इसका बच्चों को इंतजार है। यह प्रश्न बेहतर होगा कि क्या होता है । परिकल्पना और निष्कर्ष न बनाएं जैसे कि "मेरा खोल जम गया है" और फिर inferences के बारे में पूछें। वर्णन करें कि क्या होता है और उस बारे में पूछें: विशेष चरित्र टर्मिनल इनपुट अनुक्रम (जो आमतौर पर अग्रभूमि की नौकरी को निलंबित कर देगा, या नौकरी छोड़ना या छोड़ना या टर्मिनल से पढ़ने की प्रक्रिया के लिए ईओएफ संकेत भेजना) कोई प्रभाव नहीं है। क्या हो रहा है? क्यों? । यह डेबियन लिनक्स और फ्रीबीएसडी / ट्रूओएस पर नकल करने योग्य है, वैसे,
जेडबीपीपी

1
मैंने बग को zsh विकास मेलिंग सूची पर रिपोर्ट किया है । अभी के लिए, आपको इसे एक उप-भाग में लपेटकर इसके चारों ओर काम करने में सक्षम होना चाहिए(echo | $(echo vipe) | cat)
स्टीफन चेज़लस

1
तथ्य यह है कि प्रक्रिया प्रतिस्थापन की पृष्ठभूमि में शुरू किया जाता है मुझे लगता है कि दस्तावेज है (या कम से कम ज्ञात)
स्टीफन चेज़लस

जवाबों:


0

मेरा मानना ​​है कि आपका मुद्दा अनुचित रूप से आपके विस्तार को उद्धृत करता है।

Zsh से उद्धरण: 14 विस्तार

एक डॉलर चिह्न, जो $(...)या गंभीर लहजे के साथ उद्धृत किया गया है, जैसे ' ...' से पहले कोष्ठक में संलग्न एक कमांड को इसके मानक आउटपुट के साथ बदल दिया जाता है, किसी भी अनुगामी न्यूलाइन्स को हटा दिया जाता है। यदि प्रतिस्थापन दोहरे उद्धरणों में संलग्न नहीं है, तो आउटपुट को IFS पैरामीटर का उपयोग करके शब्दों में तोड़ दिया जाता है। प्रतिस्थापन $(cat foo)को समकक्ष लेकिन तेजी से बदला जा सकता है $(<foo)। या तो मामले में, यदि विकल्प GLOB_SUBST सेट किया गया है, तो आउटपुट फ़ाइल नाम पीढ़ी के लिए योग्य है।

ध्यान दें कि आपके प्रश्न में उदाहरण # 2, NULL की एक अनंत गूंज के कारण होता है:

यदि प्रतिस्थापन दोहरे उद्धरणों में संलग्न नहीं है, तो आउटपुट को IFS पैरामीटर का उपयोग करके शब्दों में तोड़ दिया जाता है।

दूसरे शब्दों में शेल असीम रूप से प्रतीक्षा करता है echo, क्योंकि डिफ़ॉल्ट सीमांकक SPACE है, गूंज कभी पूरा नहीं होता है। टीएलडीपी देखें: आंतरिक चर । यह catकमांड के लिए एक लटका हुआ पाइप छोड़ता है ।

एक कूबड़ के रूप में, मेरा मानना ​​है कि आउटपुट पुनर्निर्देशन के कारण 4 और 5 काम करते हैं।

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