क्या कमांड संरचना को फिर से लिखने का एक तरीका है A && B || C | D
ताकि बी या सी को डी में पाइप किया जाए?
वर्तमान कमांड के साथ या तो केवल B या C और D दोनों ही चलते हैं।
उदाहरण के लिए:
क्या कमांड संरचना को फिर से लिखने का एक तरीका है A && B || C | D
ताकि बी या सी को डी में पाइप किया जाए?
वर्तमान कमांड के साथ या तो केवल B या C और D दोनों ही चलते हैं।
उदाहरण के लिए:
जवाबों:
हाँ, बैश में आप कोष्ठक का उपयोग कर सकते हैं:
(A && B || C) | D
इस तरह से आउटपुट को A && B || C
पाइप किया जाएगा D
।
sh
A
A
आप इसे लिख सकते हैं
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 विफल हो