पाइपलाइनों के साथ मल्टी-लाइन बैश कमांड में अलग-अलग लाइनों पर पठनीय टिप्पणियां?


14

पाइपलाइनों का उपयोग करके शेल स्क्रिप्ट बनाते समय, और लाइनों को जारी रखने के लिए बैकस्लैश का उपयोग करते हुए, मैं एक मजबूत, पठनीय और पोर्टेबल फैशन में, अलग-अलग लाइनों पर टिप्पणियां डालना चाहता हूं ।

उदाहरण के लिए, यह असंबद्ध बहु-लाइन कमांड (इसकी स्पष्टता के लिए @DigitalRoss से चुराया गया) दिया गया:

echo abc |
     tr a-z A-Z |
     sort |
     uniq

... नीचे सौंदर्यशास्त्र के सबसे करीब है जिसे मैं पूरा करना चाहता हूं, लेकिन स्पष्ट कारणों से, काम नहीं करता है ... और हां, मैं अच्छी तरह से जानता हूं कि यह सामान्य रूप से टिप्पणी करने लायक कुछ नहीं है:

# Perform critical system task.
# NOTE - An example of what does *not* work.
echo abc |
    # Convert lowercase to uppercase.
     tr a-z A-Z |

     # Sort the results.
     sort |

     # Only show unique lines.
     uniq

मौजूदा संबंधित उत्तर मेरे लिए असंतोषजनक हैं , जो निम्नानुसार हैं:

सबसे पहले, ग्लेन जैकमैन का जवाब (एक सरणी में तर्कों को जोड़ना, और फिर सरणी को निष्पादित करना) एकल आदेशों के लिए काम करता है, लेकिन पाइपलाइनिंग के लिए काम नहीं करता है (और अगर यह किया भी, तो यह जटिलता जोड़ता है कि मैं बचना चाहूंगा)।

दूसरा, यहाँ @Gilles का उत्तर (जो उपयोग करता है :) भी पाइपलाइनिंग के साथ काम नहीं करता है, क्योंकि यह पाइपलाइन के प्रवाह को बदल देता है:

$ echo "abc" | :
$

( नोट : अगर कोई समान है :जो आउटपुट को असमान रूप से पास करता है, तो यह सौंदर्य की दृष्टि से स्वीकार्य होगा, लेकिन मैं एक को खोजने में सक्षम नहीं हूं। मैं एक कस्टम लिख सकता हूं, लेकिन यह पोर्टेबिलिटी को कम कर देगा।)

अंत में, StackOverflow पर DigitalRoss के उत्तर का अंतिम भाग एक ही पंक्ति में टिप्पणियों को जोड़ने के लिए अच्छी तरह से काम करता है, लेकिन मैं अलग-अलग लाइनों पर टिप्पणियों को दृढ़ता से पसंद करता हूं। अन्यथा, जब लाइनों की लंबाई अलग-अलग होती है, तो पठनीयता कम हो जाती है:

echo abc |         # normal comment OK here`
     /usr/local/bin/really/long/path/ridiculously-long-filename.sh |  # another normal comment OK here
     sort |        # the pipelines are automatically continued
     uniq          # final comment

मैं उन उत्तरों की तलाश कर रहा हूं जो पठनीयता को बनाए रखते हैं और जटिलता को कम करते हैं, वरना मैं जो कुछ भी देख रहा हूं, उसकी पृष्ठभूमि कुछ अलग है।


1
आपकी टिप्पणियों के बारे में ध्यान दें: मुझे एक अनुभाग या काम की इकाई की व्याख्या करते हुए टिप्पणियां लिखना सिखाया गया था। अगर एक अनुभवी कोडर बुद्धिमान टिप्पणियों को लिखता है जो बता रहा है कि वे क्या कर रहे हैं, तो संभवतः स्क्रिप्ट को बनाए रखने के साथ आने वाला कोई भी व्यक्ति हमेशा मैन पेज का उपयोग कर सकता है यदि वे उपयोग के विवरण को नहीं समझते हैं। एक टिप्पणी की तरह कभी नहीं लिखना चाहिए i++; // increment i by one। मेरा सुझाव है कि आप "द एलिमेंट्स ऑफ़ प्रोग्रामिंग स्टाइल"
bsd

मुझे लगता है कि मैं अंतिम संपादन को हटाने जा रहा हूं। किसी प्रश्न के लिए प्रश्न का उत्तर देना, उत्तर की प्रतिनियुक्ति, और स्वयं उत्तर का होना असामान्य है, लेकिन वह भाग जो यह बताता है कि अन्य उत्तर काम क्यों नहीं करते हैं, यह आवश्यक है। rozcietrzewiacz के जवाब और अपनी टिप्पणी एक साथ समस्या समझाने हालांकि (व्यक्तिगत रूप से मैं एक अलग उत्तर पोस्ट होता है और स्वीकार किए जाते हैं यह, के बाद से समस्या वह क्या वर्णित से काफी अलग था, लेकिन यह काम करता है)
माइकल Mrozek

समझ में आया - प्रतिक्रिया के लिए धन्यवाद; सबक सीखा!
रॉयस विलियम्स

जवाबों:


14

इस बारे में कैसा है?

echo abc | \
# Convert lowercase to uppercase.
tr a-z A-Z | \

# Sort the results.
sort | \

# Only show unique lines.
uniq

(बैकस्लैश को उन पंक्तियों में अंतिम चरित्र के रूप में उपयोग करने की आवश्यकता है ।) मैं उस दृष्टिकोण के पोर्टेबिलिटी के बारे में निश्चित नहीं हूं, लेकिन यह निश्चित है कि वर्तमान के साथ काम करता है bash


अहा! (facepalm) मैंने उस मुहावरे को बदल दिया जिसे मैं वास्तव में उपयोग कर रहा था जब प्रश्न को बिना महसूस किए पोस्ट कर रहा था! मैं प्रत्येक पंक्ति की शुरुआत में पाइप लगा रहा था , जिसे मैं अब करना बंद कर खुश हूं कि मुझे पता है कि यह पद्धति सभी प्रणालियों पर अच्छी तरह से काम करती है, जो मैं बैश और श दोनों में पहुंच सकता हूं। धन्यवाद!
रॉयस विलियम्स

क्या उन टिप्पणियों से लाइन निरंतरता बर्बाद नहीं होगी?
स्टुअर्ट पी। बेंटले

जब तक प्रत्येक टिप्पणी से पहले एक खाली रेखा है, तब तक यह ठीक काम करता है।
रॉयस विलियम्स
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.