&& और || के बाद बैश लाइन की निरंतरता कहाँ है? दस्तावेज?


28

मैंने इस निर्माण को स्क्रिप्ट में बहुत देखा है और इसका उपयोग खुद किया है, लेकिन यह मुझे परेशान करता है कि मैं इसे प्रलेखन में नहीं ढूंढ सकता।

उदाहरण:

[ -f file1 ] &&
[ -f file2 ] &&
echo "Both files exist." ||
echo "One or the other file doesn't exist."

जैसा कि इसमें उल्लेख किया गया है, नई कहानियों से पहले बैकस्लैश के साथ भी किया जा सकता है man bash:

If a \<newline> pair appears,  and  the  backslash  is  not
itself  quoted,  the \<newline> is treated as a line continuation (that
is, it is removed from the input stream and effectively ignored).

उदाहरण:

[ -f file1 ] && \
[ -f file2 ] && \
echo "Both files exist." || \
echo "One or the other file doesn't exist."

... लेकिन यह आवश्यक प्रतीत नहीं होता है। उपरोक्त पहला संस्करण बैकस्लैश के बिना भी काम करता है।

मुझे यह कहां मिल सकता है man bash? (इसके अलावा, यह bashविशिष्ट या POSIX शिकायत है?)


यदि आप आधिकारिक बैश या POSIX प्रलेखन की तलाश कर रहे हैं, तो गिल्स का जवाब देखें। लेकिन इस पर चर्चा की जाती है कि शेल के नियंत्रण और पुनर्निर्देशन ऑपरेटर क्या हैं? - अधिक टिप्पणियों ;, &, (और)
जी-मैन का कहना है कि 'मोनिका'

@ जी-मैन, मुझे लगता है कि मुझ पर निर्देशित नहीं किया गया था? सिर्फ भविष्य के पाठकों के लिए? जैसा कि मैंने सवाल में कहा, "यह मुझे परेशान करता है कि मैं इसे दस्तावेज़ में नहीं ढूंढ सकता।" मुझे पहले से ही पता था कि यह कैसे काम करता है, इसलिए यह वास्तव में आधिकारिक प्रलेखन के लिए केवल एक अनुरोध था। :)
वाइल्डकार्ड

यहां तक ​​कि सरणियों के मामले में, एक अंतर्निहित रेखा निरंतरता है names=( Rama Soma<newline> Sita Diya ):। अजगर यहाँ स्पष्ट रूप से इन का वर्णन करता है, लेकिन बैश प्रलेखन नहीं लगता है।
जमदग्नि

जवाबों:


39

एक नई पंक्ति को कुछ संदर्भों में नजरअंदाज कर दिया जाता है, जहां प्रकट रूप से एक असंबद्ध कमांड होती है। इन संदर्भों एक नियंत्रण ऑपरेटर के बाद शामिल हैं ( &&, ||, |, &, ;, ;;, लेकिन नहीं !)।

मैं इस दस्तावेज़ को बाश मैनुअल में नहीं देखता।

POSIX में, यह व्याकरण के नियमों के माध्यम से निर्दिष्ट किया गया है । जहां भी नियम हैं linebreak, आपके पास शून्य या अधिक लाइन ब्रेक हो सकते हैं।


+1, मुझे नहीं पता था कि यह साधारण पाइप (!) के लिए काम करता है। काश, हम उन्हें अगली पंक्ति में भी पठनीयता के लिए रख सकते, लेकिन यह उस तरह से काम नहीं करता (यदि ऐसा कर रहा है, तो आपको पूर्ववर्ती न्यूलाइन को अलग करना होगा)।
ओलिवियर दुलक

1
@OlivierDulac संभवतः यह कैसे काम कर सकता है? जब यह वर्तमान कमांड लाइन को संसाधित कर रहा है, तो यह कैसे पता चलेगा कि आप |अगली पंक्ति की शुरुआत में टाइप करने की योजना बना रहे हैं ? याद रखें, शेल का उपयोग अंतःक्रियात्मक रूप से किया जाता है, न केवल लिपियों में, और व्याकरण समान है।
बमर

@ बरमेर: मुझे पता है, मुझे यह पता है (स्कूल में कंपाइलर लिखा गया ^ ^) ... मैंने कहा "मैं चाहता हूं", और यह बहुत प्रशंसनीय इच्छा नहीं है
ओलिवियर दुलक

1
@DocSalvager, क्या आप एक तर्क बग का उदाहरण दे सकते हैं जो रोकने में मदद करेगा? मेरे पास इसे देखने का कठिन समय है ....
वाइल्डकार्ड

2
@DocSalvager, मैं वास्तव में कोड का उपयोग नहीं करूंगा क्योंकि मैंने इसे लिखा था - यह एक दृष्टांत था। हालांकि अंतिम पंक्ति (दूसरा खंड) के बिना मैं इसे इस तरह से उपयोग करूंगा। (क्योंकि "अगर यह और यह तब है कि" this && this2 && thatठीक है, लेकिन एक elseखंड के लिए मैं एक वास्तविक उपयोग करेंगे if then else fi।)
वाइल्डकार्ड
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.