बाश में बहुभाषी टिप्पणियां बनाने का तरीका?


226

मैंने हाल ही में शेल स्क्रिप्ट का अध्ययन शुरू किया है और मैं एक शेल स्क्रिप्ट में लाइनों का एक सेट टिप्पणी करना चाहूंगा। मेरा मतलब है कि यह सी / जावा के मामले में है:

/* comment1
   comment2 
   comment3
*/`

ऐसा कैसे किया जा सकता था?


2
आप हैश का उपयोग कर सकते हैं जैसे: # यह एक टिप्पणी है।
मोहम्मद तय्यब

1
मुझे पता है, लेकिन यह मल्टीलाइन के लिए थोड़ा परेशान करने वाला है।
मलिक तुरहान

2
यह ध्यान दिया जाना चाहिए कि नीचे दिए गए उत्तरों के लिए आवश्यक है कि :लाइन में पहले कॉलम (कोई अग्रणी स्थान) न हो।
ty

जवाबों:


394

: 'खोलने और 'बंद करने के लिए उपयोग करें ।

उदाहरण के लिए:

: '
This is a
very neat comment
in bash
'

27
:( और अन-रीड-क्षमता और संभावित बग-स्रोत की एक बड़ी मात्रा को भी जोड़ता है। IMHO बेहतर है बस कई #एस का उपयोग करें और यह कभी नहीं ...
jm666

51
@ jm666 IMHO शब्द का उपयोग करने का एक अच्छा विचार कभी नहीं है जब आपको सभी उपयोग के मामलों का कोई पता नहीं है।
विंटर

19
समझाने के लिए: के :लिए आशुलिपि है trueऔर trueकिसी भी पैरामीटर को संसाधित नहीं करता है। (मैनुअल पेज:SYNOPSIS true [ignored command line arguments]
phil294

46
के बीच की जगह :और 'महत्वपूर्ण है
बीकाडो

23
मैंने इसे कोड के ब्लॉक के लिए थोड़ा संशोधित किया है ताकि मैं आसानी से कोड को चालू या बंद कर सकूं। मेरा परिवर्तन # 'एकल उद्धरण के बजाय अंतिम पंक्ति पर उपयोग करना है। इस तरह मैं #कोड के ब्लॉक को सक्रिय करने के लिए पहली पंक्ति में एकल रख सकता हूं । #कोड को निष्क्रिय करने के लिए पहली पंक्ति पर निकालें ।
जॉनमुद

131

बहुभाषी टिप्पणी बैश में

: <<'END_COMMENT'
This is a heredoc (<<) redirected to a NOP command (:).
The single quotes around END_COMMENT are important,
because it disables variable resolving and command resolving
within these lines.  Without the single-quotes around END_COMMENT,
the following two $() `` commands would get executed:
$(gibberish command)
`rm -fr mydir`
comment1
comment2 
comment3
END_COMMENT

4
यह काम करता है, वर्तमान में स्वीकृत उत्तर (मेरे लिए) नहीं है।
फ्रीक

5
यह शायद ध्यान देने योग्य है कि यह प्रति टिप्पणी नहीं है। यह एक वंशानुगत है जो एनओपी कमांड को एक बहु-पंक्ति स्ट्रिंग के रूप में पुनर्निर्देशित किया गया है। एकल चर, चर और आदेशों को हल करने के लिए महत्वपूर्ण है।
नक्स

1
अंतरिक्ष जोड़ने के लिए @Freek जरूरत
mazs

मैंने इसे एक साधारण बैश स्क्रिप्ट में परीक्षण किया, जो डेबियन में शेबंग लाइन, #! / बिन / बैश के माध्यम से चलती है और यह विफल रही। मैं इस पृष्ठ पर प्रत्येक उत्तर की कोशिश कर रहा हूं, और जब तक मैं नीचे किसी को नहीं मिला, वे सभी विफल रहे। चूंकि वे असफल हो गए, इसलिए मैं उन्हें वोट दे रहा हूं, और वास्तव में ठीक से चलने वाले को वोट कर रहा हूं।
PyTis

1
अपने उदाहरण में अच्छे परीक्षण। अग्रणी :आवश्यक नहीं है। बस शुरू करो <<
वारबकी

34

मैं इस पोस्ट को टिप्पणियों और अन्य उत्तरों के आधार पर अपडेट कर रहा हूं, इसलिए 22 मई 2020 से पहले की टिप्पणियां अब लागू नहीं हो सकती हैं।

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

व्यक्तिगत रूप से मुझे लगता है कि सबसे सरल (यानी कम से कम शोर, कम से कम अजीब, टाइप करने के लिए सबसे आसान, सबसे स्पष्ट) एक उद्धृत HEREDOC का उपयोग करना है, लेकिन यह स्पष्ट करें कि आप क्या कर रहे हैं, और हर जगह एक ही HEREDOC मार्कर का उपयोग करें:

<<'### BLOCK COMMENT'
line 1
line 2

line 3
line 4
### BLOCK COMMENT

HEREDOC मार्कर को सिंगल-कोट करने से कुछ शेल पार्सिंग साइड-इफ़ेक्ट से बचा जाता है, जैसे कि अजीब सबसिस्टम जो दुर्घटना या आउटपुट का कारण बनते हैं, और मार्कर के भी पार्स करने से। तो सिंगल-कोट्स आपको ओपन-क्लोज कमेंट मार्कर पर अधिक स्वतंत्रता देते हैं। उदाहरण के लिए, निम्नलिखित ट्रिपल हैश का उपयोग करता है जो बैश में मल्टी-लाइन टिप्पणी का सुझाव देता है। यदि एकल उद्धरण अनुपस्थित थे, तो यह स्क्रिप्ट को क्रैश कर देगा। यहां तक ​​कि अगर आप हटाते हैं ###, तो FOO{}स्क्रिप्ट को क्रैश कर देगा (या खराब प्रतिस्थापन का कारण मुद्रित किया जा सकता है यदि नहीं set -e) तो एकल उद्धरण के लिए नहीं थे:

set -e

<<'### BLOCK COMMENT'
something something ${FOO{}} something
more comment
### BLOCK COMMENT

ls

आप बेशक इस्तेमाल कर सकते हैं

set -e

<<'###'
something something ${FOO{}} something
more comment
###

ls

लेकिन इस प्रवंचना से अपरिचित पाठक के लिए इसका उद्देश्य निश्चित रूप से कम स्पष्ट है।

आजकल कोई भी अच्छा संपादक आपको चयन को अन / टिप्पणी करने के लिए ctrl- / या समान को दबाने की अनुमति देता है। हर कोई निश्चित रूप से यह समझता है:

# something something ${FOO{}} something
# more comment
# yet another line of comment

हालाँकि यह माना जाता है कि यह लगभग उतना ही सुविधाजनक नहीं है जितना कि ऊपर की टिप्पणी, यदि आप अपने पैराग्राफ को फिर से भरना चाहते हैं।

निश्चित रूप से अन्य तकनीकें हैं, लेकिन ऐसा करने के लिए "पारंपरिक" तरीका नहीं लगता है। यह अच्छा होगा अगर ###>और ###<, बैश में जोड़ा जा सकता प्रारंभ और टिप्पणी ब्लॉक के अंत में इंगित करता है जैसे कि यह बिल्कुल स्पष्ट हो सकता है।


1
आह, यह एक आसान / साफ याद करने के लिए पर्याप्त है!
थम्मे गौड़ा

1
पिछले उत्तर नोटों के रूप में, बैकक्वाट्स से अलग, $ (...) अनुक्रम को भी विस्तारित किया जाएगा क्योंकि दोनों रूप कमांड प्रतिस्थापन हैं।
पर्ल अंकार

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

@perlancar अगर हम इस बात से सहमत हैं कि हैक्स ऐसे समाधान हैं जो एक ऐसी भाषा / काम की विशेषता का उपयोग करते हैं जो पूरी तरह से समस्या से असंबंधित है (जैसे कि टिप्पणी के लिए एक हेरेडोक का उपयोग करना, या जैसे कुछ न करने की आज्ञा पर एक पैरामीटर का उपयोग करना true), तो भले ही आप डॉन न हों। 'टी रिस्क ब्रेकिंग (हेरेडोक दृष्टिकोण नहीं करता है, लेकिन कोलन संस्करण करता है), 1) हैक्स अभी भी इरादे को बाधित करते हैं: मल्टीलाइन टिप्पणी के बारे में संकेत देने वाली पहली पंक्ति के बिना, अधिकांश अपने सिर को खरोंच कर सोचेंगे कि यह कोड क्या कर रहा है; और 2) में अनपेक्षित डार्क कॉर्नर होते हैं (जैसे किसी को डबल करना, कुछ मामलों में हेरेडोक मार्कर को कोट करना आदि)।
ओलिवर

@ ओलिवर: यदि अयोग्य घोषित किया जाता है, तो चर में बुरा दुष्प्रभाव हो सकता है। कल्पना कीजिए कि आप में अपने एम्बेडेड है हियरडॉक जैसे एक स्ट्रिंग -comment ${FOO:=bar}या ${FOO{}}। चर को बनाने और सेट करने के लिए पहले का दुष्प्रभाव हो सकता है FOO, दूसरा खराब प्रतिस्थापन त्रुटि को बढ़ाएगा ; दोनों प्रभाव आप एक वास्तविक टिप्पणी से उम्मीद नहीं करेंगे।
user1934428

24

यहाँ अन्य उत्तरों को पढ़ने के बाद मैं नीचे आया, जिसे IMHO ने स्पष्ट किया कि यह एक टिप्पणी है। विशेष रूप से स्क्रिप्ट उपयोग जानकारी के लिए उपयुक्त:

<< ////

Usage:
This script launches a spaceship to the moon. It's doing so by 
leveraging the power of the Fifth Element, AKA Leeloo.
Will only work if you're Bruce Willis or a relative of Milla Jovovich.

////

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

बेशक, "////"सिर्फ एक स्ट्रिंग है; उपसर्ग और प्रत्यय में स्लैश की संख्या बराबर होनी चाहिए।


3
मैं लगभग याद कियाUsage:
आरएनए

उपर्युक्त उत्तर के अतिरिक्त बढ़िया। ईमानदारी से, मुझे लगता है कि आप ऊपर दिए गए उत्तर को संपादित कर सकते थे, और इसे अलग से उत्तर देने के बजाय इसमें जोड़ा गया था।
पायटिस

कुछ "ऊपर" उत्तर हैं (आपके क्रम के आधार पर)। और, अलग से उत्तर देकर मैं अपने द्वारा चुने गए तार के पीछे के तर्क को स्पष्ट करना चाहता था।
noamtm

<< EOF ... EOF
l mingzhi

5

इस पर आपकी क्या राय है?

function giveitauniquename()
{
  so this is a comment
  echo "there's no need to further escape apostrophes/etc if you are commenting your code this way"
  the drawback is it will be stored in memory as a function as long as your script runs unless you explicitly unset it
  only valid-ish bash allowed inside for instance these would not work without the "pound" signs:
  1, for #((
  2, this #wouldn't work either
  function giveitadifferentuniquename()
  {
    echo nestable
  }
}

हैलो, मूल प्रश्न के उत्तर के बजाय एक प्रश्न के रूप में इरादा नहीं था
Imre

अच्छा IMO नहीं। इसके लिए टिप्पणी को शेल कोड के रूप में पार्स करने योग्य होना चाहिए, जो बहुत ही प्रतिबंधक है।
user1934428

3

यहां बताया गया है कि मैं कैसे bash में बहुस्तरीय टिप्पणियां करता हूं।

इस तंत्र के दो फायदे हैं जिनकी मैं सराहना करता हूं। एक यह है कि टिप्पणियों को नेस्टेड किया जा सकता है। दूसरा यह है कि ब्लॉक को आरंभ करने वाली रेखा से टिप्पणी करके सक्षम किया जा सकता है।

#!/bin/bash
# : <<'####.block.A'
echo "foo {" 1>&2
fn data1
echo "foo }" 1>&2
: <<'####.block.B'
fn data2 || exit
exit 1
####.block.B
echo "can't happen" 1>&2
####.block.A

"बी" ब्लॉक के ऊपर के उदाहरण में टिप्पणी की गई है, लेकिन "ए" ब्लॉक के हिस्से जो "बी" ब्लॉक नहीं हैं, उन पर टिप्पणी नहीं की गई है।

उस उदाहरण को चलाने से यह आउटपुट उत्पन्न होगा:

foo {
./example: line 5: fn: command not found
foo }
can't happen

3

मैंने चुना हुआ उत्तर देने की कोशिश की, लेकिन जब मैंने एक शेल स्क्रिप्ट को चलाया तो पाया, पूरी चीज़ स्क्रीन पर प्रिंट हो रही थी (इसी तरह से ज्यूपिटर नोटबुक '''xx'''उद्धरणों में सब कुछ प्रिंट कर देती है ) और अंत में एक त्रुटि संदेश था। यह कुछ भी नहीं कर रहा था, लेकिन: डरावना । तब मुझे एहसास हुआ कि इसे संपादित करते समय सिंगल-कोट्स कई लाइनों को फैला सकते हैं। तो .. बस ब्लॉक को वेरिएबल में असाइन करने देता है।

x='
echo "these lines will all become comments."
echo "just make sure you don_t use single-quotes!"

ls -l
date

'

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

2

सरल समाधान, ज्यादा स्मार्ट नहीं:

किसी स्क्रिप्ट का एक भाग अस्थायी रूप से ब्लॉक करें:

if false; then
    while you respect syntax a bit, please
    do write here (almost) whatever you want.
    but when you are
    done # write
fi

थोड़ा परिष्कृत संस्करण:

time_of_debug=false # Let's set this variable at the beginning of a script

if $time_of_debug; then # in a middle of the script  
    echo I keep this code aside until there is the time of debug!
fi

-2

# मुझे आलस और सादगी पसंद है। मैं एक मज़ेदार वर्कअराउंड के साथ # का उपयोग करूंगा:

1 प्रेस:] ctrl + F या cmd + F या जो भी [ढूँढें कार्यक्षमता को ट्रिगर करने के लिए खोजें

2 जैसे खोज क्षेत्र में एक regex का उपयोग करें: (^.+)

3 के साथ बदलें: # $1या यदि आप चाहें#$1


# नोट: आपके पास अपने संपादक के तीन चरण नहीं हो सकते हैं। उस स्थिति में ऑनलाइन रेगेक्स टूल का उपयोग करें (नीतिगत कारणों से यहां कोई सुझाव नहीं दे सकते):

  1. चयन करें, जहाँ भी आप पाठ को कॉपी करें और ऑनलाइन रेगेक्स टूल में पेस्ट करें
  2. (^.+)रेगेक्स और #$1या #\1प्रतिस्थापन पैटर्न के रूप में उपयोग करें
  3. चयन करें, पाठ की प्रतिलिपि बनाएँ और इसे वापस चिपकाएँ जहाँ आपने शुरू किया था

# अपने हैश का आनंद लें!


इन दिनों कई संपादकों के पास हॉटकी है ctrl+/जो कई लाइनों के लिए भी टिप्पणियों को चालू या बंद कर सकते हैं। यह टिप्पणी चरित्र को बदलने में भी सक्षम है कि आप किस भाषा का उपयोग कर रहे हैं।
NinMonkey
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.