बैश के लिए इनलाइन टिप्पणियां?


142

मैं एक-पंक्ति कमांड में एक एकल ध्वज को टिप्पणी करने में सक्षम होना चाहता हूं। बैश केवल from # till end-of-lineटिप्पणी करने के लिए लगता है । मैं इस तरह की तरकीबें देख रहा हूं:

ls -l $([ ] && -F is turned off) -a /etc

यह बदसूरत है, लेकिन कुछ भी नहीं से बेहतर है। क्या कोई बेहतर तरीका है?

निम्नलिखित काम करने लगता है, लेकिन मुझे यकीन नहीं है कि यह पोर्टेबल है:

ls -l `# -F is turned off` -a /etc

#comment: चाल भी यहाँ उल्लेख किया है stackoverflow.com/questions/9522631/...
जुहा Palomäki

1
@ जूहा पालोमाकी द्वारा उल्लिखित लिंक के बाद , ${IFS#comment}टिप्पणियों में @pjh द्वारा शुरू की गई यह अद्भुत चाल है । कोई उप-शेल नहीं है।
एलेक्सिस

जवाबों:


110

मेरा पसंदीदा है:

बैश लिपि में टिप्पणी करना

यह कुछ ओवरहेड होगा, लेकिन तकनीकी रूप से यह आपके प्रश्न का उत्तर देता है

echo abc `#put your comment here` \
     def `#another chance for a comment` \
     xyz etc

और विशेष रूप से पाइपलाइनों के लिए, बिना ओवरहेड के एक क्लीनर समाधान है

echo abc |        # normal comment OK here
     tr a-z A-Z | # another normal comment OK here
     sort |       # the pipelines are automatically continued
     uniq         # final comment

मल्टी-लाइन कमांड के लिए एक लाइन टिप्पणी कैसे करें


3
ध्यान दें कि आपको बैकटिक्स का उपयोग करना है, $(#comment)काम नहीं करता है।
फफूंद

1
कुछ संस्करण )टिप्पणी के हिस्से के रूप में ही विचार करेंगे। बैश की अधिकांश चुनौतियां पुराने संस्करणों के साथ रेट्रो संगतता के कारण हैं, और एक आम रणनीति संभव सबसे पुराने समाधान का उपयोग करना है।
राफारेनो

2
ध्यान दें, यह एक वास्तविक टिप्पणी नहीं है: true && `# comment` && trueएक वैध अभिव्यक्ति है। एक वास्तविक टिप्पणी कुछ इस तरह उत्पन्न करेगी: syntax error near unexpected token && '`
सेबस्टियन वैगनर

आप सही हैं @sebastianwagner, यह भी ध्यान दें कि यह OR शॉर्ट सर्किट या ऐसा कुछ करने में विफल होगा, लेकिन मुझे लगता है कि यह बहुत अच्छा है क्योंकि हम चीजों को बहुत जटिल किए बिना प्राप्त कर सकते हैं। मेरे लिए यह एक संकेत है कि किसी को एक बेहतर भाषा की आवश्यकता है, लेकिन यह बहुत अच्छा कर सकता है, पहले से निर्मित कोड को बनाए रखने के लिए इस तरह के 'कॉमेंट्स' को बनाए रखने के लिए।
राफारेनो

धन्यवाद जिसने मेरी मदद की!
xiarnousx

58

मुझे यह आसान (और सबसे पठनीय) लगता है कि बस लाइन को कॉपी करें और मूल संस्करण पर टिप्पणी करें:

#Old version of ls:
#ls -l $([ ] && -F is turned off) -a /etc
ls -l -a /etc

स्पष्टता के लिए अपवोट। पता नहीं क्यों यह पहला विकल्प नहीं है।
डेविड टैबरेरो एम।

लेकिन तब यह इनलाइन नहीं है? मुझे लगता है कि इसके निष्पक्ष कहने की जरूरत है कि इस काम को करने की जरूरत है, जो एक और तरीका है
थोरसुमोनर

25

$(: ...) थोड़ा कम बदसूरत है, लेकिन अभी भी अच्छा नहीं है।


2
इस सिंटैक्स द्वारा आप एक सब-शेल फायर कर रहे हैं, एक टिप्पणी को कोड व्यवहार को बदलने के बिना रीडेबिलिटी में सुधार करने के लिए रखा गया है, लेकिन इस सब शेल को हच / समाप्त करने का समय आपके कोड को धीमा कर देगा (कम से कम कहने के लिए), नई लाइन की शुरुआत में केवल कोलन का उपयोग क्यों नहीं किया जाता है?
राफारेनो

1
$ {IFS # ...} के साथ कोई उप-शेल नहीं लगाया गया है।
एलेक्सिस

3
@ राफारेनो: हाँ। लेकिन गंभीरता से, 95% अनुप्रयोगों में यह ओवरहेड बिल्कुल भी मायने नहीं रखेगा। ऐसे कई मामलों के लिए जहां यह मायने रखता है, संभवतः पहले स्थान पर बैश की तुलना में तेज़ भाषा का उपयोग करना अच्छा होगा।
लेफ्टरनैबाउट

... समस्या यह है कि, $(: ...)वाक्यविन्यास वास्तव में टिप्पणियों को एम्बेड करने की अनुमति नहीं देता है: जबकि echo "foo" `# comment` "bar"दूसरी बैकटिक पर टिप्पणी को समाप्त कर देगा, माना जाता है कि समकक्ष echo "foo" $(: # comment) "bar"इसके पीछे कुछ भी पार्स नहीं करता है #
लेफ्टरनैबाउट


4

यहाँ कई पाइप कमांड के बीच इनलाइन टिप्पणियों के लिए मेरा समाधान है।

उदाहरण के लिए अनियंत्रित कोड:

    #!/bin/sh
    cat input.txt \
    | grep something \
    | sort -r

एक पाइप टिप्पणी के लिए समाधान (एक सहायक कार्य का उपयोग करके):

    #!/bin/sh
    pipe_comment() {
        cat - 
    }
    cat input.txt \
    | pipe_comment "filter down to lines that contain the word: something" \
    | grep something \
    | pipe_comment "reverse sort what is left" \
    | sort -r

या यदि आप पसंद करते हैं, तो हेल्पर फ़ंक्शन के बिना यहां भी यही समाधान है, लेकिन यह थोड़ा गड़बड़ है:

    #!/bin/sh
    cat input.txt \
    | cat - `: filter down to lines that contain the word: something` \
    | grep something \
    | cat - `: reverse sort what is left` \
    | sort -r

7
एक तरफ के रूप में, यदि आप पिछली पंक्ति के अंत में पाइप चरित्र को स्थानांतरित करते हैं, तो आप yucky बैकस्लैश-नईलाइन्स से छुटकारा पा सकते हैं।
ट्रिपलए

3

अधिकांश आदेश किसी भी क्रम में आर्गन की अनुमति देते हैं। बस टिप्पणी किए गए झंडे को रेखा के अंत में ले जाएं:

ls -l -a /etc # -F is turned off

फिर इसे वापस चालू करने के लिए, बस टेक्स्ट को अनफ्रेंड करें और हटा दें:

ls -l -a /etc -F

1
लानत है, मैंने #कमांड के बाद एक भी व्हाट्सएप के बिना जोड़ा । धन्यवाद!
asgs

1

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

ls -l $ {1 # -F बंद है} -a / etc

§ 10.2। पैरामीटर प्रतिस्थापन


${name:=comment}सुरक्षित होने के लिए उपयोग करें ।
कैन-नेड_फूड

1

जैसे कमांड के एक हिस्से को अक्षम करने के लिए a && b, मैंने बस एक खाली स्क्रिप्ट बनाई है xजो रास्ते में है, इसलिए मैं इस तरह की चीजें कर सकता हूं:

mvn install && runProject

जब मुझे निर्माण करने की आवश्यकता होती है, और

x mvn install && runProject

जब नहीं (का उपयोग करते हुए Ctrl + Aऔर Ctrl + Eशुरुआत और अंत करने के लिए स्थानांतरित करने के लिए)।

जैसा कि टिप्पणियों में बताया गया है, बैश बिल्ट-इन के :बजाय एक और तरीका है x:

$  : Hello world, how are you? && echo "Fine."
Fine.

2
इस तरह का :string; of; commands; : disabled; enabled;
बिलिन

और भी बेहतर :) धन्यवाद
ओंद्र :)ižka

-1

यदि टिप्पणी करने लायक है, तो यह संभवतः पंक्ति के अंत में, या अपने दम पर एक पंक्ति में जा सकता है। मैं शायद ही कभी किसी भी भाषा में टिप्पणी से पहले और बाद में कोड के साथ लाइन टिप्पणियों के भीतर की जरूरत है।

ओह, एक अपवाद है, जो कि एसक्यूएल की बोली है जो मैं आमतौर पर '{टिप्पणियाँ}' का उपयोग करता हूं। कभी-कभी, मैं लिखूंगा:

CREATE UNIQUE INDEX u1_table ON Table(...);
CREATE {DUPS} INDEX d1_table ON Table(...);

लेकिन वह भी एक खिंचाव है।

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