पाइप बी से डी? - A && B || सी | डी


14

क्या कमांड संरचना को फिर से लिखने का एक तरीका है A && B || C | Dताकि बी या सी को डी में पाइप किया जाए?

वर्तमान कमांड के साथ या तो केवल B या C और D दोनों ही चलते हैं।

उदाहरण के लिए:

यहाँ छवि विवरण दर्ज करें

जवाबों:


31

हाँ, बैश में आप कोष्ठक का उपयोग कर सकते हैं:

(A && B || C) | D

इस तरह से आउटपुट को A && B || Cपाइप किया जाएगा D


6
या A && (B || C) | D, यदि आप B, C, या D नहीं चाहते हैं जब A विफल हो
zwol

2
आप sh
परेंस

यह स्पष्ट नहीं है कि घुंघराले ब्रेसिज़ के बजाय कोष्ठक का उपयोग करना एक जानबूझकर निर्णय था (यदि हां, तो क्या लाभ हैं?) या सिर्फ एक निरीक्षण। क्या आप समझाएँगे?
टॉम फेनेच

@TomFenech Parens अभिव्यक्ति को उप-शेल में चलाने का कारण बनता है, जो कि बाकी स्क्रिप्ट के POV से एकल (एकल) अलग प्रक्रिया है। इसलिए, पैरेन्स के अंदर अभिव्यक्ति का जो भी आउटपुट है, उसे एक साथ पाइप किया जाएगा। (चूंकि AA
उपखंड के

1
@jpaugh मुझे लगता है कि अलगाव के बारे में आपकी बात एक अच्छी है लेकिन घुंघराले ब्रेसिज़ का उपयोग करते समय आउटपुट उसी तरह से पाइप किया जाएगा, है न?
टॉम फेनेच

14

आप इसे लिख सकते हैं

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उत्पादन की दो पंक्तियाँ है।
wchargin

@wchargin ... | ...एक उपधारा को बनाने का कारण बनता है, यह अपरिहार्य है। ( ... )कम से कम सिद्धांत रूप में, एक अतिरिक्त उपधारा का निर्माण होता है जिससे { ...; }बचा जाता है, लेकिन इसका मतलब है कि मैं "के साथ मतलब है या दूर अनुकूलित नहीं हो सकता है": यह संभव है कि इस विशेष मामले में, शेल को पता चलता है कि यह कोई फर्क नहीं पड़ता, प्रभाव समान होगा।
hvd

5

एक्यूप्रेशर उत्तर सही है, लेकिन यह संभावित उपयोग के मामले को इनपुट के रूप में आउटपुट नहीं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

( एचवीडी के उत्तर का अंतिम भाग भी देखें, जब मैंने अपना मूल उत्तर लिखा था तो मैंने नोटिस नहीं किया था।)


मेरा जवाब है कि कवर। देखें कि मैंने अपने "नोट 2:" में क्या रखा है, जहां मैं बस Aपाइपलाइन से बाहर चला गया।
hvd

@ हव्ड: आप सही हैं और मेरे उत्तर के उस हिस्से को इंगित करने के लिए धन्यवाद! मैंने अपना दावा बदल दिया और आपको तदनुसार क्रेडिट दिया।
डेविड फोस्टरस्टर
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.