मल्टीलाइन कमांड के अंदर बैश स्क्रिप्ट में टिप्पणी करना


164

मैं एक स्क्रिप्ट से निम्नलिखित पंक्तियों की प्रत्येक पंक्ति पर कैसे टिप्पणी कर सकता हूं?

cat ${MYSQLDUMP} | \
sed '1d' | \
tr ",;" "\n" | \
sed -e 's/[asbi]:[0-9]*[:]*//g' -e '/^[{}]/d' -e 's/""//g' -e '/^"{/d' | \
sed -n -e '/^"/p' -e '/^print_value$/,/^option_id$/p' | \
sed -e '/^option_id/d' -e '/^print_value/d' -e 's/^"\(.*\)"$/\1/' | \
tr "\n" "," | \
sed -e 's/,\([0-9]*-[0-9]*-[0-9]*\)/\n\1/g' -e 's/,$//' | \
sed -e 's/^/"/g' -e 's/$/"/g' -e 's/,/","/g' >> ${CSV}

अगर मैं कोशिश करूँ और एक टिप्पणी की तरह जोड़ूँ:

cat ${MYSQLDUMP} | \ # Output MYSQLDUMP File

मुझे मिला:

#: not found

क्या यहां टिप्पणी करना संभव है?


1
ठीक है, जैसा कि आपने देखा, यदि आप # पहले करते हैं, तो \ _ टिप्पणी का सिर्फ एक हिस्सा बन जाता है, लेकिन यदि आप \ पहली करते हैं, तो बाद में लाइन पर मौजूद अक्षर "लाइन कंटिन्यू" से "बोली" तक इसका अर्थ बदल देते हैं। मैंने नीचे दिए गए एक समाधान के बारे में सोचा है।
डिजिटलरॉज़ सिप

जवाबों:


203

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

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

स्टैक ओवरफ्लो प्रश्न देखें मल्टी-लाइन कमांड के लिए लाइन कमेंट कैसे रखें


1
अगर कोई सरल तरीका नहीं है, बल्कि जटिल लगता है?
बैसकॉज

1
ठीक है, मैंने थोड़ा सरल रूपांतर जोड़ा है।
डिजिटलरॉज

1
क्या आप इस तथ्य को दर्शाने के लिए अपने उत्तर को संशोधित कर सकते हैं कि बैकस्लैश की आवश्यकता नहीं है इसलिए मैं टिप्पणियों को प्रत्येक पंक्ति के बगल में रख सकता हूं और बस एक पाइप का उपयोग कर सकता हूं?
बैसकॉज

मैंने सत्यापित किया कि संस्करण एक और दो काम करते हैं। हालांकि, क्या आप बता सकते हैं कि वे ऐसा क्यों करते हैं और यहां क्या चल रहा है? धन्यवाद।
फहीम मीठा

1
स्पष्टीकरण के लिए धन्यवाद। मैंने unix.sx पर एक प्रश्न खोला है, और अधिक विवरण के लिए पूछ रहा है, निरंतरता चरित्र के बाद टिप्पणियों के साथ मल्टी लाइन कमांड को बैश करें
फहीम मीठा

39

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

आपको अपने कमांड के बीच में टिप्पणी लाइनें डालने में सक्षम होना चाहिए

# output MYSQLDUMP file
cat ${MYSQLDUMP} | \
# simplify the line
sed '/created_at/d' | \
# create some newlines
tr ",;" "\n" | \
# use some sed magic
sed -e 's/[asbi]:[0-9]*[:]*//g' -e '/^[{}]/d' -e 's/""//g' -e '/^"{/d' | \
# more magic
sed -n -e '/^"/p' -e '/^print_value$/,/^option_id$/p' | \
# even more magic
sed -e '/^option_id/d' -e '/^print_value/d' -e 's/^"\(.*\)"$/\1/' | \
tr "\n" "," | \
# I hate phone numbers in my output
sed -e 's/,\([0-9]*-[0-9]*-[0-9]*\)/\n\1/g' -e 's/,$//' | \ 
# one more sed call and then send it to the CSV file
sed -e 's/^/"/g' -e 's/$/"/g' -e 's/,/","/g' >> ${CSV}

12
पाइपलाइन कमांड कंपोनेंट के समाप्त होने पर \ _ आवश्यक नहीं है |
डिजिटलरॉस सिप

2
DigitalRoss, आप सही हैं, मैं सिर्फ पाइप का उपयोग कर सकता हूं, बैकस्लैश का नहीं और फिर मेरे # काम पूरी तरह से काम करेंगे ... क्या आप इसे उत्तर के रूप में पोस्ट कर सकते हैं ताकि मैं इसे स्वीकार कर सकूं।
बैसकॉज

8
"आपको अपने आदेशों के बीच टिप्पणी लाइनें डालने में सक्षम होना चाहिए": नहीं, यह केवल इसलिए काम कर रहा है क्योंकि पिछली लाइनों का अंतिम व्याख्या किया गया चरित्र है |। यदि आप कोशिश करते हैं cat file1\<newline>#comment<newline>file2, तो आप देखेंगे कि आपको नहीं मिलता है cat file1 file2, बल्कि cat file1; file2
डबियसजिम

5
हालांकि, जैसा कि दूसरों ने उल्लेख किया है, cat file1 | # comment<newline>sortठीक काम करता है। तो भी करता है cat file1 && # comment<newline>echo foo। टिप्पणी के बाद शामिल किया जा सकता तो |या &&या ||नहीं, बल्कि बाद `\` या कमांड के बीच में।
22

7

जैसा कि DigitalRoss ने बताया है, जब लाइन का अंत समाप्त होता है, तो पीछे की ओर झुकाव आवश्यक नहीं होता है |। और आप निम्न पर एक पंक्ति में टिप्पणी डाल सकते हैं |:

 cat ${MYSQLDUMP} |         # Output MYSQLDUMP file
 sed '1d' |                 # skip the top line
 tr ",;" "\n" | 
 sed -e 's/[asbi]:[0-9]*[:]*//g' -e '/^[{}]/d' -e 's/""//g' -e '/^"{/d' |
 sed -n -e '/^"/p' -e '/^print_value$/,/^option_id$/p' |
 sed -e '/^option_id/d' -e '/^print_value/d' -e 's/^"\(.*\)"$/\1/' |
 tr "\n" "," |
 sed -e 's/,\([0-9]*-[0-9]*-[0-9]*\)/\n\1/g' -e 's/,$//' |   # hate phone numbers
 sed -e 's/^/"/g' -e 's/$/"/g' -e 's/,/","/g' >> ${CSV}

5

बैकस्लैश # से बच जाता है, एक टिप्पणी चरित्र के बजाय इसे अपने शाब्दिक चरित्र के रूप में व्याख्या करता है।


3

$IFS टिप्पणी हैक

इस हैक का उपयोग करता है पैरामीटर विस्तार पर $IFSहै, जो आदेशों में अलग शब्द प्रयोग किया जाता है:

$ echo foo${IFS}bar
foo bar

इसी तरह:

$ echo foo${IFS#comment}bar
foo bar

इसका उपयोग करते हुए, आप एक कमांड लाइन पर एक टिप्पणी डाल सकते हैं:

$ echo foo${IFS# Comment here} \
> bar
foo bar

लेकिन टिप्पणी \जारी रखने से पहले की आवश्यकता होगी ।

ध्यान दें कि पैरामीटर विस्तार टिप्पणी के अंदर किया जाता है:

$ ls file
ls: cannot access 'file': No such file or directory
$ echo foo${IFS# This command will create file: $(touch file)}bar
foo bar
$ ls file
file

दुर्लभ अपवाद

एकमात्र दुर्लभ मामला यह विफल रहता है यदि $IFSपहले सटीक पाठ के साथ शुरू किया जाता है जिसे विस्तार के माध्यम से हटा दिया जाता है (यानी, #चरित्र के बाद ):

$ IFS=x
$ echo foo${IFS#y}bar
foo bar
$ echo foo${IFS#x}bar
foobar

ध्यान दें कि फाइनल foobarमें कोई स्थान नहीं है, इस मुद्दे को दर्शाते हुए।

चूंकि $IFSइसमें डिफ़ॉल्ट रूप से केवल व्हाट्सएप शामिल है, इसलिए यह इस समस्या में आपके द्वारा चलाए जाने की बहुत संभावना नहीं है।


@ Pjh की टिप्पणी का श्रेय जिसने इस उत्तर को दिया।


1

DigitalRoss द्वारा उदाहरणों के अलावा, यहां एक और रूप है जिसका उपयोग आप $()बैकटिक्स के बजाय यदि आप चाहें तो कर सकते हैं`

echo abc $(: comment) \
     def $(: comment) \
     xyz

बेशक, आप कोलतार सिंटैक्स का उपयोग बैकटिक्स के साथ भी कर सकते हैं:

echo abc `: comment` \
     def `: comment` \
     xyz

अतिरिक्त नोट्स

कारण $(#comment)काम नहीं करता है क्योंकि एक बार यह देखने के बाद #, यह समापन कोष्ठक सहित टिप्पणियों के रूप में शेष पंक्ति का व्यवहार करता है comment):। इसलिए कोष्ठक कभी बंद नहीं होता।

बैकटिक्स अलग तरह से पार्स करते हैं और ए के बाद भी समापन बैकटिक का पता लगाएंगे #


1
क्या वह हर टिप्पणी के लिए एक नया खोल पैदा करेगा?
lonix

0

यहाँ एक बैश स्क्रिप्ट है जो कई पिछली टिप्पणियों के विचारों और मुहावरों को जोड़ती है, उदाहरण के लिए, इनलाइन टिप्पणियों को सामान्य रूप प्रदान करने के लिए ${__+ <comment text>}

विशेष रूप से

  • <comment text> मल्टी-लाइन हो सकता है
  • <comment text> पैरामीटर-विस्तारित नहीं है
  • कोई उपप्रकार नहीं हैं (ताकि टिप्पणियाँ कुशल हों)

इस पर एक प्रतिबंध है <comment text>, अर्थात्, असंतुलित ब्रेसिज़ '}'और कोष्ठक ')'को संरक्षित किया जाना चाहिए (यानी, '\}'और '\)')।

स्थानीय बैश वातावरण पर एक आवश्यकता है:

  • पैरामीटर नाम __परेशान होना चाहिए

कोई अन्य वाक्य-रचना मान्य बैश पैरामीटर-नाम के स्थान पर काम करेगा __, बशर्ते कि नाम का कोई निर्धारित मूल्य न हो।

एक उदाहरण स्क्रिप्ट निम्नानुसार है

# provide bash inline comments having the form
#     <code> ${__+ <comment>} <code> 
#     <code> ${__+ <multiline
#                   comment>} <code>

# utility routines that obviate "useless use of cat"
function bashcat { printf '%s\n' "$(</dev/stdin)"; }
function scat { 1>&2 bashcat; exit 1; }

# ensure that '__' is unset && remains unset
[[ -z ${__+x} ]] &&  # if '__' is unset
  declare -r __ ||   # then ensure that '__' remains unset 
  scat <<EOF         # else exit with an error
Error: the parameter __='${__}' is set, hence the
  comment-idiom '\${__+ <comment text>}' will fail
EOF

${__+ (example of inline comments)
------------------------------------------------
the following inline comment-idiom is supported
    <code> ${__+ <comment>} <code> 
    <code> ${__+ <multiline
                  comment>} <code> 
(advisory) the parameter '__' must NOT be set;
  even the null declaration __='' will fail
(advisory) protect unbalanced delimiters \} and \) 
(advisory) NO parameter-expansion of <comment> 
(advisory) NO subprocesses are spawned
(advisory) a functionally equivalent idiom is 
    <code> `# <comment>` <code> 
    <code> `# <multiline
               comment>` <code>
however each comment spawns a bash subprocess
that inelegantly requires ~1ms of computation 
------------------------------------------------}
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.