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