क्या कमांड संरचना को फिर से लिखने का एक तरीका है A && B || C | Dताकि बी या सी को डी में पाइप किया जाए?
वर्तमान कमांड के साथ या तो केवल B या C और D दोनों ही चलते हैं।
उदाहरण के लिए:
क्या कमांड संरचना को फिर से लिखने का एक तरीका है A && B || C | Dताकि बी या सी को डी में पाइप किया जाए?
वर्तमान कमांड के साथ या तो केवल B या C और D दोनों ही चलते हैं।
उदाहरण के लिए:
जवाबों:
हाँ, बैश में आप कोष्ठक का उपयोग कर सकते हैं:
(A && B || C) | D
इस तरह से आउटपुट को A && B || Cपाइप किया जाएगा D।
sh
AA
आप इसे लिख सकते हैं
if A; then B; else C; fi | D
आप कहते हैं कि आप Bया तो चलाना चाहते हैं C, लेकिन A && B || Cवह हासिल नहीं करता है। यदि Aसफल होता है, लेकिन Bरन और विफल रहता है, तो यह निष्पादित करेगा C।
नोट 1: यदि आप किसी तरह गारंटी दे सकते हैं कि Bहमेशा सफल होता है और एक छोटे संस्करण के साथ रहना चाहता है, तो मैं अभी भी विकल्प चुनूंगा
{ A && B || C; } | D
बाद में ( ... ), जैसा कि बाद में अनावश्यक रूप से एक नया उप-समूह बनाने के लिए बाध्य करता है, जो दूर अनुकूलित हो सकता है या नहीं हो सकता है।
नोट 2: दोनों रूपों का मानना है कि Aकोई आउटपुट नहीं है, जो आपके उदाहरण में सही है लेकिन जरूरी नहीं कि सामान्य रूप से ऐसा हो। जिससे बचा जा सकता है
A; if [ "$?" -eq 0 ]; then B; else C; fi | D
{ … }पाइप के कारण एक उपधारा बनाने के लिए मजबूर नहीं करता है? मैं निम्नलिखित व्यवहार पर ध्यान दें: pgrep bashऔर pgrep bash | catऔर if true; then pgrep bash; fiऔर { pgrep bash; }उत्पादन की एक पंक्ति है, ( pgrep bash; )और ( pgrep bash; ) | catऔर { pgrep bash; } | catऔर if true; then pgrep bash; fi | catउत्पादन की दो पंक्तियाँ है।
... | ...एक उपधारा को बनाने का कारण बनता है, यह अपरिहार्य है। ( ... )कम से कम सिद्धांत रूप में, एक अतिरिक्त उपधारा का निर्माण होता है जिससे { ...; }बचा जाता है, लेकिन इसका मतलब है कि मैं "के साथ मतलब है या दूर अनुकूलित नहीं हो सकता है": यह संभव है कि इस विशेष मामले में, शेल को पता चलता है कि यह कोई फर्क नहीं पड़ता, प्रभाव समान होगा।
एक्यूप्रेशर उत्तर सही है, लेकिन यह संभावित उपयोग के मामले को इनपुट के रूप में आउटपुट नहींA करता है D। यह प्राप्त करने के लिए कि आपको अपनी आवश्यकताओं के Aआधार पर एक स्ट्रीम पुनर्निर्देशन की आवश्यकता होगी।
यदि आप Aकिसी भी तरह का उत्पादन छोड़ना चाहते हैं :
{ A >/dev/null && B || C; } | Dयदि आप Aटर्मिनल पर आउटपुट देखना चाहते हैं :
{ A >/dev/tty && B || C; } | Dयदि आपको Aबाद के कमांड के इनपुट के रूप में आउटपुट की आवश्यकता है, Eतो आपको एक अतिरिक्त कमांड समूह और स्ट्रीम पुनर्निर्देशन की आवश्यकता होगी:
{ { A >&3 && B || C; } | D; } 3>&1 | Eयदि यह सब आपको बहुत रहस्यमय लगता है (जैसा कि यह मेरे साथ होता है) मैं सलाह देता हूं कि आप विशेष शेल चर का उपयोग बाहर निकलने की स्थिति के लिए करें Aऔर उसके साथ काम करें:
A
if [ $? -eq 0 ]; then
B
else
C
fi |
D
यदि आप अधिक संक्षिप्त होना चाहते हैं, लेकिन बहुत अधिक नहीं हैं, तो मैं यह सुझाव देता हूं:
A; { [ $? -eq 0 ] && B || C; } | D
( एचवीडी के उत्तर का अंतिम भाग भी देखें, जब मैंने अपना मूल उत्तर लिखा था तो मैंने नोटिस नहीं किया था।)
Aपाइपलाइन से बाहर चला गया।
A && (B || C) | D, यदि आप B, C, या D नहीं चाहते हैं जब A विफल हो