ขณะที่มันเป็นความจริงที่บาง builtins เปลือกอาจจะมีเพียงการแสดงในที่สมบูรณ์คู่มือ - โดยเฉพาะอย่างยิ่งสำหรับผู้ที่bash
builtins -specific ว่าคุณเพียง แต่มีแนวโน้มที่จะใช้งานบนระบบ GNU (GNU folks ที่เป็นกฎที่ไม่เชื่อในman
และ ชอบinfo
หน้าของตนเอง) - ยูทิลิตี้ POSIX ส่วนใหญ่ - เชลล์บิลด์หรืออื่น ๆ - แสดงได้อย่างดีในคู่มือโปรแกรมเมอร์ POSIX
นี่คือข้อความที่ตัดตอนมาจากด้านล่างของฉันman sh
(ซึ่งอาจมีความยาว 20 หน้าหรือมากกว่านั้น ... )
ทุกคนที่อยู่ที่นั่นและอื่น ๆ ที่ไม่ได้กล่าวถึงเช่น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] ที่กำหนดไว้ในบรรทัดคำสั่ง มันเป็นสีเอาท์พุทและพิมพ์เพื่อ stdout
มันทำงานโดยการประเมินระดับการเยื้อง โดยทั่วไปแล้วบรรทัดอินพุตที่ไม่ว่างจะถูกละเว้น แต่เมื่อพบบรรทัดว่างก็จะเริ่มให้ความสนใจ มันรวบรวมเส้นจากที่นั่นจนกว่าจะได้รับการตรวจสอบว่าลำดับปัจจุบันเยื้องแน่นอนกว่าในบรรทัดแรกของมันก่อนที่จะเกิดขึ้นบรรทัดว่างอื่นหรือมิฉะนั้นมันจะลดลงด้ายและรอว่างเปล่าต่อไป หากการทดสอบประสบความสำเร็จจะพยายามจับคู่สายรอเทียบกับ args ของบรรทัดคำสั่ง
ซึ่งหมายความว่าการแข่งขันรูปแบบจะตรงกับ:
heading
match ...
...
...
text...
..และ..
match
text
..แต่ไม่..
heading
match
match
notmatch
..หรือ..
text
match
match
text
more text
หากสามารถจับคู่ได้มันจะเริ่มพิมพ์ มันจะตัดช่องว่างนำของบรรทัดที่ตรงกันจากทุกบรรทัดที่พิมพ์ - ดังนั้นไม่ว่าระดับเยื้องจะพบว่าเส้นที่อยู่บนนั้นพิมพ์ออกมาราวกับว่ามันอยู่ที่ด้านบน มันจะพิมพ์ต่อไปจนกว่าจะพบกับอีกบรรทัดหนึ่งในระดับที่เท่ากันหรือน้อยกว่าเยื้องกว่าบรรทัดที่จับคู่ดังนั้นส่วนทั้งหมดจะถูกจับคู่กับหัวเรื่องการจับคู่รวมถึงส่วนย่อย / ทั้งหมดย่อหน้าที่อาจมี
ดังนั้นโดยทั่วไปถ้าคุณขอให้จับคู่กับรูปแบบมันจะทำเฉพาะกับหัวเรื่องหัวเรื่องบางชนิดและจะระบายสีและพิมพ์ข้อความทั้งหมดที่พบภายในส่วนที่นำหน้าด้วยการจับคู่ของมัน ไม่มีสิ่งใดถูกบันทึกเช่นเดียวกับสิ่งนี้ยกเว้นการเยื้องบรรทัดแรกของคุณ - และเพื่อให้สามารถทำงานได้อย่างรวดเร็วและจัดการ\n
อินพุต ewline ที่แยกจากกันได้ทุกขนาด
ฉันใช้เวลาพอสมควรที่จะคิดวิธีการย่อส่วนย่อยเป็นแบบต่อไปนี้:
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
อักขระ ewline จะถูกลบออกจากเอาต์พุต
\n
อักขระ ewline ไม่เคยเกิดขึ้นในพื้นที่รูปแบบการป้อนข้อมูล พวกเขาสามารถเป็นผลมาจากการแก้ไขเท่านั้น
:print
และ:indent
เป็นทั้งลูปปิดซึ่งกันและกันและเป็นวิธีเดียวที่จะได้รับ\n
ewline
:print
วนรอบของวนรอบเริ่มต้นถ้าตัวอักษรนำในบรรทัดเป็นชุดของช่องว่างตามด้วย\n
อักขระ ewline
:indent
รอบของเริ่มต้นที่บรรทัดว่าง - หรือบน:print
เส้นรอบที่ล้มเหลว#test
- แต่:indent
ลบ\n
ลำดับ+ ewline นำที่ว่างทั้งหมดออกจากเอาต์พุต
- เมื่อ
:print
เริ่มต้นมันจะดึงเส้นอินพุตต่อไปดึงแถบพื้นที่ว่างออกไปจนถึงจำนวนที่พบในบรรทัดแรกในวัฏจักรของมันแปลส่วนที่เกินและทำความเข้าใจ backspace escapes ลงในช่องสีที่หนีออกมาและพิมพ์ผลลัพธ์จนกว่าจะ#test
ล้มเหลว
- ก่อนที่จะ
:indent
เริ่มต้นมันเป็นครั้งแรกการตรวจสอบh
พื้นที่เก่าต่อเนื่องเยื้องไปได้ใด ๆ(เช่นย่อยก)และจากนั้นยังคงที่จะดึงในการป้อนข้อมูลตราบใดที่#test
ล้มเหลวและสายการใด ๆ [-
ต่อไปนี้เป็นครั้งแรกที่จะมีการแข่งขันอย่างต่อเนื่อง เมื่อบรรทัดหลังจากบรรทัดแรกไม่ตรงกับรูปแบบนั้นจะถูกลบ - และต่อมาดังนั้นจะมีทุกบรรทัดต่อไปนี้จนกระทั่งบรรทัดว่างถัดไป
#match
และ#test
สะพานทั้งสองวงปิด
#test
ผ่านเมื่อซีรีย์นำของช่องว่างนั้นสั้นกว่าซีรีย์ตามด้วย\n
ewline สุดท้ายในลำดับบรรทัด
#match
เพิ่ม\n
ewlines ชั้นนำที่จำเป็นในการเริ่ม:print
วงจรไปยัง:indent
ลำดับเอาต์พุตใด ๆ ของซึ่งนำไปสู่การจับคู่กับ ARG บรรทัดคำสั่งใด ๆ ลำดับผู้ที่ไม่ได้มีการแสดงผลที่ว่างเปล่า - :indent
และที่เกิดบรรทัดว่างจะถูกส่งกลับไปยัง