हालांकि यह सच है कि कुछ खोल builtins एक अल्प एक पूरा मैनुअल में दिखा हो सकता है - विशेष रूप से उन लोगों के लिए bash
विशिष्ट builtins है कि आप एक जीएनयू सिस्टम पर उपयोग करने के लिए केवल संभावना हो (जीएनयू लोगों, एक नियम के रूप में, में विश्वास नहीं करते man
और अपने स्वयं के info
पृष्ठों को पसंद करें ) - पॉसिक्स उपयोगिताओं के विशाल बहुमत - शेल बिल्डरों या अन्यथा - पोसिक्स प्रोग्रामर गाइड में बहुत अच्छी तरह से प्रतिनिधित्व करते हैं।
यहाँ मेरे नीचे से एक अंश है man sh
(जो कि शायद २० पेज लंबा या ऐसा है ...)
उन सब के सब देखते हैं, और दूसरों को इस तरह के उल्लेख नहीं के रूप में set
, read
, break
... अच्छी तरह से, मैं उन सभी के नाम की जरूरत नहीं है। लेकिन (1P)
नीचे दाईं ओर ध्यान दें - यह POSIX श्रेणी 1 मैनुअल श्रृंखला को दर्शाता है - वे man
पृष्ठ हैं जिनके बारे में मैं बात कर रहा हूं।
यह हो सकता है कि आपको सिर्फ एक पैकेज स्थापित करने की आवश्यकता हो? यह एक डेबियन प्रणाली के लिए आशाजनक लग रहा है। जबकि help
उपयोगी है, यदि आप इसे पा सकते हैं, तो आपको निश्चित रूप से उस POSIX Programmer's Guide
श्रृंखला को प्राप्त करना चाहिए । यह बेहद मददगार हो सकता है। और यह घटक पृष्ठ बहुत विस्तृत हैं।
एक तरफ, शेल बिल्डरों को हमेशा विशिष्ट शेल के मैनुअल के एक विशिष्ट खंड में सूचीबद्ध किया जाता है। zsh
, उदाहरण के लिए, उसके लिए एक अलग man
पेज है - (मुझे लगता है कि यह 8 या 9 या इतने पर अलग-अलग zsh
पेज हैं - जिनमें zshall
से बहुत बड़ा है)।
आप grep
man
निश्चित रूप से कर सकते हैं :
man bash 2>/dev/null |
grep '^[[:blank:]]*read [^`]*[-[]' -A14
read [-ers] [-a aname] [-d delim] [-i text] [-n
nchars] [-N nchars] [-p prompt] [-t timeout] [-u
fd] [name ...]
One line is read from the standard input, or
from the file descriptor fd supplied as an
argument to the -u option, and the first
word is assigned to the first name, the sec‐
ond word to the second name, and so on, with
leftover words and their intervening separa‐
tors assigned to the last name. If there
are fewer words read from the input stream
than names, the remaining names are assigned
empty values. The characters in IFS are
used to split the line into words using the
same rules the shell uses for expansion
... जो खोल man
पेज खोजते समय मैं जो करता था, उसके बहुत करीब है । लेकिन ज्यादातर मामलों में help
बहुत अच्छा है bash
।
मैं वास्तव में sed
हाल ही में इस तरह के सामान को संभालने के लिए एक स्क्रिप्ट पर काम कर रहा हूं । यह है कि मैंने ऊपर की तस्वीर में अनुभाग को कैसे पकड़ा। यह अब भी मुझे पसंद है की तुलना में अधिक है, लेकिन इसमें सुधार हो रहा है - और यह बहुत आसान हो सकता है। अपने वर्तमान पुनरावृत्ति में यह बहुत मज़बूती से पाठ के संदर्भ-संवेदी खंड को निकालेगा जैसा कि कमांड लाइन पर दिए गए [a] पैटर्न [s] के आधार पर किसी अनुभाग या उपधारा शीर्षक से मेल खाता है। यह अपने आउटपुट को रंग देता है और स्टडआउट को प्रिंट करता है।
यह इंडेंट स्तरों का मूल्यांकन करके काम करता है। गैर-रिक्त इनपुट लाइनों को आमतौर पर नजरअंदाज कर दिया जाता है, लेकिन जब यह एक खाली लाइन का सामना करता है तो यह ध्यान देना शुरू कर देता है। यह वहां से लाइनों को इकट्ठा करता है जब तक कि यह सत्यापित नहीं किया है कि वर्तमान अनुक्रम निश्चित रूप से आगे की ओर संकेत करता है कि दूसरी खाली लाइन होने से पहले इसकी पहली पंक्ति थी या फिर यह थ्रेड ड्रॉप करता है और अगले रिक्त की प्रतीक्षा करता है। यदि परीक्षण सफल होता है तो यह अपने कमांड-लाइन आर्ग्स के खिलाफ लीड लाइन से मेल खाने का प्रयास करता है।
इसका मतलब है कि एक मैच पैटर्न मैच करेगा:
heading
match ...
...
...
text...
..तथा..
match
text
..लेकिन नहीं..
heading
match
match
notmatch
..or ..
text
match
match
text
more text
यदि कोई मैच हो सकता है तो वह प्रिंट करना शुरू कर देता है। यह सभी रेखाओं से मुद्रित रेखाओं के मिलान वाले रिक्त स्थान को छीन लेगा - यह प्रिंट नहीं करता है, इसलिए कोई फर्क नहीं पड़ता है कि इस पर उस लाइन ने पाया कि यह उस पर प्रिंट करता है जैसे कि यह शीर्ष पर था। यह तब तक प्रिंट करना जारी रखेगा जब तक कि इसकी मिलान रेखा की तुलना में समान या कम-से-कम इंडेंट स्तर पर दूसरी पंक्ति का सामना नहीं करता है - इसलिए पूरे अनुभागों को किसी भी / सभी उपखंडों, पैराग्राफों सहित सिर्फ एक हेडिंग मैच के साथ पकड़ा जाता है।
इसलिए मूल रूप से यदि आप इसे एक पैटर्न से मेल खाने के लिए कहते हैं तो यह केवल किसी प्रकार के विषय के खिलाफ ऐसा करेगा और इसके मिलान के अंतर्गत आने वाले अनुभाग के सभी पाठ को रंग देगा और प्रिंट करेगा। कुछ भी नहीं सहेजा जाता है क्योंकि यह आपकी पहली पंक्ति के इंडेंट को छोड़कर ऐसा करता है - और इसलिए यह बहुत तेज़ हो सकता है और \n
वस्तुतः हर आकार के इनपुट को अलग कर सकता है ।
मुझे यह पता लगाने में थोड़ी देर लग गई कि नीचे की तरह सबहेडिंग में कैसे फिर से आना है:
Section Heading
Subsection Heading
लेकिन मैंने आखिरकार इसे सुलझा लिया।
मुझे सादगी के लिए पूरी बात को फिर से तैयार करना था, हालाँकि। जबकि इससे पहले कि मैं कई छोटे छोरों को उनके संदर्भ में फिट करने के लिए कुछ अलग तरीके से ज्यादातर एक ही काम कर रहा था, उनकी पुनरावृत्ति के साधनों को अलग करके मैं कोड के बहुमत को डी-डुप्लिकेट करने में कामयाब रहा। अब दो छोर हैं - एक प्रिंट और एक चेक इंडेंट। दोनों एक ही परीक्षण पर निर्भर करते हैं - प्रिंट लूप तब शुरू होता है जब परीक्षण पास हो जाता है और इंडेंट लूप तब विफल हो जाता है जब वह विफल हो जाता है या रिक्त रेखा पर शुरू होता है।
पूरी प्रक्रिया बहुत तेज है क्योंकि ज्यादातर समय यह /./d
किसी भी गैर-रिक्त लाइन को हटा देता है और आगे बढ़ता है - यहां तक zshall
कि स्क्रीन को तुरंत पॉप्युलेट करने के परिणामस्वरूप भी । यह नहीं बदला है।
वैसे भी, यह अभी तक बहुत उपयोगी है, हालांकि। उदाहरण के लिए, read
ऊपर की बात इस तरह की जा सकती है:
mansed bash read
... और इसे पूरा ब्लॉक मिलता है। यह किसी भी पैटर्न या जो भी, या कई तर्क ले सकता है, हालांकि पहले हमेशा वह man
पृष्ठ होता है जिसमें उसे खोजना चाहिए। मैंने इसके कुछ आउटपुट की तस्वीर यहाँ दी है:
mansed bash read printf
... दोनों ब्लॉक पूरे लौटा दिए गए हैं। मैं अक्सर इसका उपयोग करता हूं:
mansed ksh '[Cc]ommand.*'
... जिसके लिए यह काफी उपयोगी है। इसके अलावा, प्राप्त SYNOPS[ES]
करना वास्तव में आसान है:
यहाँ है अगर आप इसे एक चक्कर देना चाहते हैं - अगर आप नहीं करते हैं तो मैं आपको दोष नहीं दूंगा।
mansed() {
MAN_KEEP_FORMATTING=1 man "$1" 2>/dev/null | ( shift
b='[:blank:]' s='[:space:]' bs=$(printf \\b) esc=$(printf '\033\[') n='\
' match=$(printf "\([${b}]*%s[${b}].*\)*" "$@")
sed -n "1p
/\n/!{ /./{ \$p;d
};x; /.*\n/!g;s///;x
:indent
/.*\n\n/{s///;x
};n;\$p;
/^\([^${s}].*\)*$/{s/./ &/;h; b indent
};x; s/.*\n[^-[]*\n.*//; /./!x;t
s/[${s}]*$//; s/\n[${b}]\{2,\}/${n} /;G;h
};
#test
/^\([${b}]*\)\([^${b}].*\n\)\1\([${b}]\)/!b indent
s//\1\2.\3/
:print
/^[${s}]*\n\./{ s///;s/\n\./${n}/
/${bs}/{s/\n/ & /g;
s/\(\(.\)${bs}\2\)\{1,\}/${esc}38;5;35m&${esc}0m/g
s/\(_${bs}[^_]\)\{1,\}/${esc}38;5;75m&${esc}0m/g
s/.${bs}//g;s/ \n /${n}/g
s/\(\(${esc}\)0m\2[^m]*m[_ ]\{,2\}\)\{2\}/_/g
};p;g;N;/\n$/!D
s//./; t print
};
#match
s/\n.*/ /; s/.${bs}//g
s/^\(${match}\).*/${n}\1/
/../{ s/^\([${s}]*\)\(.*\)/\1${n}/
x; s//${n}\1${n}. \2/; P
};D
");}
संक्षेप में, वर्कफ़्लो है:
- कोई भी रेखा जो रिक्त नहीं है और जिसमें एक
\n
ईलाइन वर्ण नहीं है, आउटपुट से हटा दिया गया है।
\n
ewline वर्ण इनपुट पैटर्न स्पेस में कभी नहीं होते हैं। वे केवल एक संपादन के परिणाम के रूप में हो सकते हैं।
:print
और :indent
दोनों पारस्परिक रूप से आश्रित बंद छोरों हैं और एक \n
ewline प्राप्त करने का एकमात्र तरीका है ।
:print
लूप चक्र शुरू होता है अगर एक पंक्ति पर अग्रणी अक्षर एक रिक्त पंक्ति की श्रृंखला है जिसके बाद एक \n
इवालाइन वर्ण होता है।
:indent
चक्र खाली लाइनों पर शुरू होता है - या :print
साइकिल लाइनों पर जो विफल रहता है #test
- लेकिन इसके उत्पादन से :indent
सभी प्रमुख रिक्त + \n
ewline दृश्यों को हटा देता है ।
- एक बार
:print
शुरू होने के बाद यह इनपुट लाइनों में खींचता रहेगा, इसके चक्र में पहली पंक्ति में पाई जाने वाली राशि तक व्हाट्सएप को छीन लेगा, ओवरस्ट्राइक का अनुवाद करेगा और बैकस्पेस को रंग टर्मिनल से बच जाता है, और #test
विफल होने तक परिणामों को प्रिंट करता है।
:indent
शुरू होने से पहले यह h
किसी भी संभावित इंडेंट निरंतरता (जैसे सब्सक्रिप्शन) के लिए पहले पुराने स्थान की जांच करता है , और फिर इनपुट में खींचता #test
रहता है जब तक कि विफल रहता है और पहली बार के बाद किसी भी लाइन का मिलान जारी रहता है [-
। जब पहली के बाद की एक पंक्ति उस पैटर्न से मेल नहीं खाती है - और उसके बाद अगली खाली लाइन तक सभी निम्न पंक्तियाँ हैं।
#match
और #test
दो बंद लूपों को पाट दें।
#test
जब \n
एक पंक्ति अनुक्रम में अंतिम ewline द्वारा पीछा श्रृंखला की तुलना में कम की अग्रणी श्रृंखला गुजरती है ।
#match
किसी भी आउटपुट के अनुक्रमों के लिए \n
एक :print
चक्र शुरू करने के लिए आवश्यक अग्रणी ewlines को प्रस्तुत :indent
करता है जो किसी भी कमांड-लाइन के लिए एक मैच के साथ लीड करता है। वे क्रम जो खाली नहीं हैं - और परिणामी रिक्त रेखा को वापस पारित किया जाता है :indent
।