যদিও এটি সত্য যে কোনও কিছু শেল বিল্টিনের সম্পূর্ণ ম্যানুয়ালটিতে খুব অল্প পরিমাণ উপস্থিত থাকতে পারে - বিশেষত bash
sp নির্দিষ্ট বিল্টিনগুলির জন্য যা আপনি কেবল একটি জিএনইউ সিস্টেমে ব্যবহার করতে পারবেন (জিএনইউ ভাবেন, একটি নিয়ম হিসাবে, বিশ্বাস করবেন না man
এবং তাদের নিজস্ব info
পৃষ্ঠাগুলি পছন্দ করুন ) - পসিক্স ইউটিলিটিগুলির বিশাল সংখ্যা - শেল বিল্টিন বা অন্যথায় - পসিক্স প্রোগ্রামার গাইডে খুব ভালভাবে উপস্থাপিত।
এখানে আমার (যা সম্ভবত 20 পৃষ্ঠাগুলি বা তার বেশি দীর্ঘ লম্বা ...) এর নীচে থেকে একটি অংশ রয়েছেman sh
ঐ সব আছে, এবং অন্যদের যেমন উল্লেখ করা যেমন set
, read
, break
... ভাল, আমি তাদের সব নাম প্রয়োজন হবে না। তবে (1P)
নীচের ডানদিকে নীচে নোট করুন - এটি পসিক্স বিভাগ 1 ম্যানুয়াল সিরিজটি বোঝায় - সেই man
পৃষ্ঠাগুলি যা আমি বলছি।
এটি হতে পারে যে আপনি কেবল একটি প্যাকেজ ইনস্টল করা প্রয়োজন? এটি একটি দেবিয়ান সিস্টেমের জন্য আশাব্যঞ্জক দেখাচ্ছে। যদিও help
দরকারী, আপনি তা খুঁজে পেতে পারেন, আপনি স্পষ্টভাবে যে পাওয়া উচিত POSIX Programmer's Guide
সিরিজ। এটি অত্যন্ত সহায়ক হতে পারে। এবং এর উপাদান পৃষ্ঠা খুব বিস্তারিত।
এদিকে, শেল বিল্টিনগুলি প্রায় সর্বদা নির্দিষ্ট শেলের ম্যানুয়ালটির একটি নির্দিষ্ট বিভাগে তালিকাবদ্ধ থাকে। zsh
উদাহরণস্বরূপ, এর জন্য একটি সম্পূর্ণ পৃথক man
পৃষ্ঠা রয়েছে - (আমার মনে হয় এটি মোট 8 বা 9 বা এর বেশি স্বতন্ত্র zsh
পৃষ্ঠাগুলিতে - zshall
যা বিশাল is
আপনি 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] প্যাটার্ন [এর] ভিত্তিতে বিভাগ বা উপশাখা শিরোনামের সাথে মিলিতভাবে পাঠ্যের একটি প্রসঙ্গ-সংবেদনশীল অংশটি খুব নির্ভরযোগ্যভাবে বের করে আনবে। এটি এর আউটপুট এবং রঙ প্রিন্ট stdout।
এটি ইনডেন্টের স্তরগুলি মূল্যায়নের মাধ্যমে কাজ করে। খালি ফাঁকা ইনপুট লাইনগুলি সাধারণত উপেক্ষা করা হয়, তবে যখন এটি একটি ফাঁকা রেখার মুখোমুখি হয় তখন এটি মনোযোগ দেওয়া শুরু করে। এটি সেখান থেকে রেখাগুলি সংগ্রহ করে যতক্ষণ না এটি যাচাই করে নেওয়া হয় যে বর্তমান ক্রমটি অবশ্যই অন্য ফাঁকা রেখা দেখা দেওয়ার আগে তার প্রথম লাইনটির তুলনায় আরও নির্দিষ্টভাবে প্রবেশ করিয়েছে বা অন্যথায় এটি থ্রেড ফেলে পরবর্তী খালিটির জন্য অপেক্ষা করে। যদি পরীক্ষাটি সফল হয় তবে এটি তার কমান্ড-লাইন আর্গুমেন্টগুলির সাথে লিডলাইনটি মিলানোর চেষ্টা করে।
এর অর্থ একটি মিলের প্যাটার্নটি মিলবে:
heading
match ...
...
...
text...
..এবং..
match
text
..কিন্তু না..
heading
match
match
notmatch
..or ..
text
match
match
text
more text
যদি কোনও ম্যাচ করা যায় তবে এটি মুদ্রণ শুরু করে। এটি মুদ্রিত সমস্ত লাইন থেকে মিলিত লাইনের শীর্ষস্থানীয় ফাঁকা অংশগুলি ছিটিয়ে দেবে - সুতরাং এটি নির্ধারিত কোনও ইন্ডেন্টের স্তরেরই নয় যে এটি যে লাইনটি খুঁজে পেয়েছিল তা প্রিন্ট করে যেন এটি শীর্ষে রয়েছে। এটি মেলে থাকা লাইনের চেয়ে সমান বা কম ইনডেন্ট স্তরের সাথে অন্য একটি লাইনের মুখোমুখি না হওয়া পর্যন্ত এটি মুদ্রণ অবিরত থাকবে - সুতরাং পুরো বিভাগগুলি কেবলমাত্র একটি শিরোনামের ম্যাচ দিয়ে ধরা হবে, এতে যে কোনও / সমস্ত বিভাগ, অনুচ্ছেদগুলি থাকতে পারে including
সুতরাং মূলত যদি আপনি এটি কোনও প্যাটার্নের সাথে মেলে জিজ্ঞাসা করেন তবে এটি কেবল কোনও প্রকারের শিরোনামের বিরুদ্ধে এটি করবে এবং এটি তার ম্যাচের নেতৃত্বাধীন বিভাগের মধ্যে পাওয়া সমস্ত পাঠ্যকে রঙ এবং মুদ্রণ করবে। আপনার প্রথম লাইনের ইনডেন্ট ব্যতীত কিছুই সংরক্ষণ করা হয় না - এবং তাই এটি খুব দ্রুত হতে পারে এবং \n
কার্যত কোনও আকারের ইওলাইন পৃথক ইনপুট পরিচালনা করতে পারে ।
নীচের মতো সাবহেডিংগুলিতে কীভাবে পুনরাবৃত্তি করতে হবে তা বুঝতে আমার কিছুটা সময় লেগেছে:
Section Heading
Subsection Heading
কিন্তু আমি শেষ পর্যন্ত এটি বাছাই।
যদিও সরলতার জন্য আমাকে পুরো জিনিসটি পুনরায় কাজ করতে হয়েছিল। যদিও এর আগে আমি বেশ কয়েকটি ছোট লুপগুলি বেশিরভাগ ক্ষেত্রে একই বিষয়গুলি কিছুটা ভিন্ন উপায়ে তাদের প্রসঙ্গে মাপসই করতাম, তাদের পুনরাবৃত্তির উপায়গুলি পরিবর্তিত করে আমি সংখ্যাগরিষ্ঠ কোডটিকে নকল করে ফেললাম। এখন দুটি লুপ রয়েছে - একটি প্রিন্ট এবং একটি চেক ইনডেন্ট। উভয়ই একই পরীক্ষার উপর নির্ভর করে - পরীক্ষা পাস করার সাথে সাথে মুদ্রণ লুপটি শুরু হয় এবং যখন ফাঁকা লাইনে ব্যর্থ হয় বা শুরু হয় তখন ইনডেন্ট লুপটি গ্রহণ করে।
পুরো প্রক্রিয়াটি খুব দ্রুত হয় কারণ বেশিরভাগ সময় এটি /./d
কোনও খালি রেখাটি কেবলমাত্র এগারটি করে এবং পরবর্তীটিতে চলে যায় - এমনকি zshall
স্ক্রিনটি তাত্ক্ষণিকভাবে পপুলেট করার ফলাফল । এটি পরিবর্তন হয়নি।
যাইহোক, এটি এখন পর্যন্ত খুব দরকারী। উদাহরণস্বরূপ, read
উপরের জিনিসটি এইভাবে করা যেতে পারে:
mansed bash read
... এবং এটি পুরো ব্লক পেয়ে যায়। এটি যে কোনও নিদর্শন বা যা কিছু, বা একাধিক যুক্তি নিতে পারে, যদিও সর্বদা প্রথম man
পৃষ্ঠায় এটি অনুসন্ধান করা উচিত should আমি করার পরে এর কিছু আউটপুটের একটি চিত্র এখানে দেওয়া হয়েছে :
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
ইওলাইন অক্ষর ইনপুট প্যাটার্ন স্পেসে কখনই ঘটে না। এগুলি কেবল সম্পাদনার ফলাফল হিসাবেই হতে পারে।
:print
এবং :indent
উভয়ই পারস্পরিক নির্ভরশীল বদ্ধ লুপ এবং কেবল একটি \n
ewline পাওয়ার একমাত্র উপায় ।
:print
লুপের চক্রটি শুরু হয় যদি কোনও লাইনের শীর্ষস্থানীয় অক্ষরগুলি \n
ফাঁকাগুলির একটি সিরিজ হয় তারপরে একটি ewline চরিত্র।
:indent
এর চক্রটি ফাঁকা লাইনে - বা :print
চক্র লাইনে শুরু হয় যা ব্যর্থ হয় #test
- তবে এর আউটপুট থেকে :indent
সমস্ত নেতৃস্থানীয় ফাঁকা + \n
ইলাইন ক্রম সরিয়ে দেয়।
- একবার
:print
শুরু হলে এটি ইনপুট লাইনগুলি টানতে থাকবে, তার চক্রের প্রথম লাইনে পাওয়া পরিমাণ পর্যন্ত শীর্ষস্থানীয় সাদা অংশকে স্ট্র্যাপ করবে, ওভারস্ট্রাইক এবং আন্ডারট্রাইক ব্যাকস্পেস এসিডসকে রঙিন টার্মিনাল পলায়নে অনুবাদ করবে এবং #test
ব্যর্থ হওয়া পর্যন্ত ফলাফল মুদ্রণ করবে ।
:indent
এটি শুরু হওয়ার আগে এটি h
কোনও সম্ভাব্য ইনডেন্ট ধারাবাহিকতা (যেমন একটি সাবসেকশন) এর জন্য পুরানো স্থানটি পরীক্ষা করে এবং তারপরে #test
ব্যর্থ হওয়া অবধি ইনপুটটি টানতে অবিরত থাকে এবং প্রথমটির পরে থাকা কোনও লাইন মিলতে থাকে [-
। যখন প্রথমটির পরে কোনও লাইন সেই প্যাটার্নটির সাথে মেলে না সেটি মুছে ফেলা হয় - এবং পরবর্তীকালে পরবর্তী ফাঁকা রেখা পর্যন্ত নিম্নলিখিত সমস্ত লাইন থাকে।
#match
এবং #test
দুটি বন্ধ লুপ ব্রিজ করুন।
#test
শূন্যস্থানগুলির শীর্ষস্থানীয় সিরিজটি \n
লাইন অনুক্রমের শেষ ইওলাইন দ্বারা অনুসরণ করা সিরিজের তুলনায় ছোট হয় passes
#match
\n
যে :print
কোনও :indent
আউটপুট অনুক্রমের জন্য একটি চক্র শুরু করার জন্য প্রয়োজনীয় শীর্ষস্থানীয় ইওলাইনগুলিকে প্রেন্ড করে যা কোনও কমান্ড-লাইন আর্গের সাথে ম্যাচের সাথে নেতৃত্ব দেয়। সেই ক্রমগুলি খালি রেন্ডার করা হয় না - এবং ফলস্বরূপ ফাঁকা রেখাটি আবার চলে যায় :indent
।