व्यवस्था की सूचना:
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
डिफ़ॉल्ट आउटपुट द्वारा fzf
stdout और पैरामीटर प्रतिस्थापन केवल 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
प्रक्रिया प्रतिस्थापन का उपयोग करके रीडायरेक्ट करता है ।
when either a computer program or system ceases to respond to inputs
(echo | $(echo vipe) | cat)
ps
आपको बताएगा, इनमें से किसी भी मामले में गोले जमे हुए या अटक नहीं रहे हैं। वे सामान्य तरीके से बच्चे की प्रक्रियाओं की प्रतीक्षा कर रहे हैं; और जब वे बाल प्रक्रियाएँ निलंबित या समाप्त हो जाएँगी तो वे वास्तव में सामान्य तरीके से इनपुट के लिए संकेत देना शुरू कर देंगे। आपके प्रश्न शीर्षक और शरीर में एक निहित गलत आधार शामिल है। "मेरा खोल क्यों जमता है?" जब आपके खोल वास्तव में पहले स्थान पर ठंड नहीं है, तो एक अचूक लोडेड प्रश्न है। इस निहित झूठे आधार को हटाने के लिए आपके पास एक बेहतर प्रश्न होगा।