बहुस्तरीय शेल स्क्रिप्ट टिप्पणियां - यह कैसे काम करता है?


92

हाल ही में, मैंने एक बहुस्तरीय टिप्पणी प्रकार पर ठोकर खाई, जिसे मैंने पहले कभी नहीं देखा है - यहाँ एक स्क्रिप्ट उदाहरण है:

echo a
#
: aaa 
: ddd 
#
echo b

यह काम करने लगता है, यहां तक ​​कि vimइसे सिंटैक्स-हाइलाइट करता है। टिप्पणी करने की इस शैली को क्या कहा जाता है और मुझे इसके बारे में अधिक जानकारी कैसे मिल सकती है?


1
यदि आप इसके बजाय अपने कोड को फ़ंक्शन में लपेटते हैं तो इसे टिप्पणी करें? CommentedOutBlock() { echo "test"; }
बुक्सि 12

जवाबों:


135

यह एक बहु-पंक्ति टिप्पणी नहीं है। #एक एकल पंक्ति टिप्पणी है। :(बृहदान्त्र) एक टिप्पणी नहीं है, बल्कि एक शेल-इन-कमांड है जो मूल रूप से एक एनओपी है , एक अशक्त ऑपरेशन जो वापसी के अलावा कुछ भी नहीं करता है, जैसे कि true(और इस तरह $?एक साइड इफेक्ट के रूप में 0 पर सेट )। हालाँकि चूंकि यह एक कमांड है, यह तर्कों को स्वीकार कर सकता है, और चूंकि यह अपने तर्कों को अनदेखा करता है, ज्यादातर मामलों में यह सतही रूप से एक टिप्पणी की तरह काम करता है। इस कीचड़ के साथ मुख्य समस्या यह है कि तर्कों का अभी भी विस्तार किया गया है, जिसके परिणामस्वरूप अनपेक्षित परिणामों की मेजबानी की जा सकती है। तर्क अभी भी वाक्यविन्यास त्रुटियों से प्रभावित हैं, पुनर्निर्देशन अभी भी किया जाता है इसलिए अलग : > fileहो जाएगा file, और : $(dangerous command)प्रतिस्थापन अभी भी चलेंगे।

शेल स्क्रिप्ट में टिप्पणी डालने के लिए कम से कम आश्चर्यजनक पूरी तरह से सुरक्षित तरीका है #। मल्टी-लाइन टिप्पणियों के लिए भी छड़ी। टिप्पणियों के लिए कभी भी (ab) उपयोग करने का प्रयास करें :। शेल में कोई समर्पित मल्टी-लाइन टिप्पणी तंत्र नहीं है जो समान भाषाओं /* */में स्लैश-स्टार फॉर्म के अनुरूप है C


संपूर्णता के लिए, लेकिन इसलिए नहीं कि यह अनुशंसित अभ्यास है, मैं उल्लेख करूंगा कि बहु-पंक्ति "टिप्पणियां" करने के लिए यहां दस्तावेजों का उपयोग करना संभव है :

: <<'end_long_comment'
This is an abuse of the null command ':' and the here-document syntax
to achieve a "multi-line comment".  According to the POSIX spec linked 
above, if any character in the delimiter word ("end_long_comment" in 
this case) above is quoted, the here-document will not be expanded in 
any way.  This is **critical**, as failing to quote the "end_long_comment" 
will result in the problems with unintended expansions described above. 
All of this text in this here-doc goes to the standard input of :, which 
does nothing with it, hence the effect is like a comment.  There is very 
little point to doing this besides throwing people off.  Just use '#'.
end_long_comment

29
+1 को उद्धरण पर रखने के लिए बहुत महत्वपूर्ण है <<- जो प्रतिस्थापन और विस्तार को बंद कर देता है।
ग्लेन जैकमैन

4
और एक अतिरिक्त नोट के रूप में, :उन चीजों के लिए शेल स्क्रिप्ट को भरना चाहिए जिन पर टिप्पणी होनी चाहिए, अतिरिक्त रैम / सीपीयू खपत का कारण होगा। यह आपके डेस्कटॉप पर साधारण चीजों के लिए मैटर नहीं करेगा, लेकिन अगर यह कुछ सैकड़ों या हजारों बार एक दूसरे को निष्पादित करता है, तो आप कुछ भी नहीं कर रहे हैं, जो कि तेज है
bahamat

3
@ नौबत: यदि आप किसी सैकड़ो या हज़ारों बार किसी दूसरी घटना को अंजाम देते हैं, तो मुझे आशा है कि आप इसे शेल में नहीं लिखेंगे ... = /
7heo.tk

1
कभी-कभी, पाठ की कई पंक्तियों के लिए अशक्त उपयोगिता का उपयोग करना उपयोगी हो सकता है। : <<=cutइसके साथ टिप्पणी शुरू करने से शेल स्क्रिप्ट में POD लिखना संभव हो जाता है , विवरण के लिए यह उदाहरण देखें । यह उपयोग करने के लिए संभव बनाता है perldoc script.sh। हालाँकि, इस उत्तर में दिखाई जाने वाली मल्टी-लाइन टिप्पणी कुछ ऐसी है जो निश्चित रूप से एक टिप्पणी ब्लॉक (प्रत्येक पंक्ति जिसके साथ शुरू होनी चाहिए) होनी चाहिए #
बेसिक

यहाँ heredocs पर एक अच्छी चर्चा है, दोनों टिप्पणियों और अन्य दिलचस्प उपयोग के मामलों के लिए उपयोग किया जाता है (यहां तक ​​कि dynaimc स्क्रिप्ट पीढ़ी सहित): tldp.org/LDP/abs/html/here-docs.html#EX71C
bguiz

28

यह टिप्पणी करने की कोई शैली नहीं है। :बिल्ट-इन कमांड बिल्कुल कुछ नहीं करता है; यहाँ टिप्पणी करने के लिए इसका दुरुपयोग किया जा रहा है।

$ help :
:: :
    Null command.

    No effect; the command does nothing.

    Exit Status:
    Always succeeds.

25

शुरुआती गोले में, कॉलोन टिप्पणी बनाने का एकमात्र तरीका था।

हालांकि, यह एक सच्ची टिप्पणी नहीं है, क्योंकि लाइन को उसी तरह से पार्स किया गया है जैसे किसी अन्य कमांड को पार्स किया जाता है, और इसके दुष्प्रभाव हो सकते हैं। उदाहरण के लिए:

: ${a:=x} # assigns the value 'x' to the variable, 'a'

: $(command) # executes 'command'

(कभी-कभी बृहदान्त्र का उपयोग पूरी तरह से उन दुष्प्रभावों को लागू करने के उद्देश्य से किया जाता है, लेकिन तब इसे टिप्पणी के रूप में उपयोग नहीं किया जाता है)

कभी-कभी किसी स्क्रिप्ट के एक खंड पर टिप्पणी करने के लिए कोलन का उपयोग करना सुविधाजनक होता है:

: '
while [ "$n" -ne "$x" ]
do
  : whatever
done
'

यह प्रत्येक पंक्ति के साथ आने से पहले एक महान समय है #, खासकर अगर टिप्पणी करना केवल अस्थायी है।


2
वह एकल-उद्धरण टिप्पणी पद्धति स्क्रिप्ट के किसी भी भाग पर काम नहीं करती है जो स्वयं एकल-उद्धरण का उपयोग करती है। और अगर आप उद्धरणों का उपयोग कहीं भी कर रहे हैं जितना आपको करना चाहिए, तो इसका मतलब है कि आपके पास स्क्रिप्ट में सभी में छिड़कने वाले वैध एकल उद्धरण होंगे। यह सिर्फ किसी भी सभ्य संपादक का उपयोग करने के लिए इतना सरल है कि आपको टिप्पणियों को ब्लॉक करने की सुविधा देता है।
jw013

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

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

यह ऐसा करने का सबसे कठिन तरीका है। प्रलेखन के छोटे ब्लॉकों के लिए बढ़िया। मुझे यह पसंद है /* */और बेहतर है , मुझे शुरू न करें <!-- -->!
एलेक्स ग्रे

1

यदि आपकी टिप्पणी स्क्रिप्ट के अंत में है, तो आप इसे इस तरह से कर सकते हैं:

#!/bin/sh
echo 'hello world'
exec true
we can put whatever we want here
\'\"\$\`!#%&()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_
abcdefghijklmnopqrstuvwxyz{|}~
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.