Bazı kabuk builtins bir kıt tam manuel gösterilmesini olabileceğini bunun doğru olsa - özellikle olanlar için bash
bir GNU sisteminde kullanılmak üzere sadece olasılığınız olduğunu 'e özgü yerleşikleri inanmıyorum, kural olarak (GNU millet, man
ve kendi info
sayfalarını tercih et )) - POSIX araçlarının büyük çoğunluğu - kabuk yapı taşları veya başka türlü - POSIX Programcı El Kitabı'nda çok iyi bir şekilde temsil edilmektedir.
İşte benim altından bir alıntı man sh
(muhtemelen 20 sayfa ya da öylesine ...)
Bunların tamamı vardır ve diğerleri böyle belirtilmeyen set
, read
, break
... şey, ben hepsini isim gerekmez. Ancak (1P)
sağ alt köşede - POSIX kategori 1 manuel serisinin - bunlar man
hakkında konuştuğum sayfalar olduğunu gösterir.
Sadece bir paket yüklemeniz gerekebilir mi? Bu bir Debian sistemi için umut verici görünüyor. help
Yararlı olsa da, bulabilirseniz kesinlikle bu POSIX Programmer's Guide
diziyi almalısınız . Son derece yardımcı olabilir. Ve kurucu sayfaları çok ayrıntılı.
Bu bir yana, kabuk yerleşikleri neredeyse her zaman belirli kabuğun kullanım kılavuzunun belirli bir bölümünde listelenir. zsh
, örneğin, bunun için ayrı bir man
sayfa var - (8 ya da 9 ya da öylesine ayrı zsh
sayfalarda toplandığını düşünüyorum zshall
.
grep
man
Tabii ki sadece :
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
... bir kabuk man
sayfasını ararken yaptığım işe oldukça yakın . Ancak çoğu durumda help
oldukça iyidir bash
.
sed
Son zamanlarda bu tür şeyleri halletmek için bir senaryo üzerinde çalışıyorum . Resimdeki bölümü bu şekilde yakaladım. Hala sevdiğimden daha uzun, ama gelişiyor - ve oldukça kullanışlı olabilir. Mevcut yinelemesinde, komut satırında verilen [a] desenine [s] dayanarak bir bölüme veya alt bölüm başlığına eşleştirildiği gibi içeriğe duyarlı bir metin bölümünü oldukça güvenilir bir şekilde çıkaracaktır. Çıktısını renklendirir ve stdout'a yazdırır.
Girinti düzeylerini değerlendirerek çalışır. Boş olmayan giriş satırları genellikle göz ardı edilir, ancak boş bir satırla karşılaştığında dikkat etmeye başlar. Geçerli dizinin kesinlikle başka bir boş satır oluşmadan önce ilk satırından daha fazla girintili olduğunu doğrulayana kadar çizgileri oradan toplar veya ipliği düşürür ve bir sonraki boşluğu bekler. Sınama başarılı olursa, kılavuz çizgisini komut satırı argümanlarıyla eşleştirmeye çalışır.
Bu, bir eşleşme deseninin eşleşeceği anlamına gelir :
heading
match ...
...
...
text...
..ve..
match
text
..Ama değil..
heading
match
match
notmatch
..veya..
text
match
match
text
more text
Bir eşleşme elde edilebilirse, yazdırmaya başlar. Eşleştirilen çizginin önde gelen boşluklarını yazdırdığı tüm satırlardan sıyırır - bu nedenle girinti düzeyi üzerinde olursa olsun, üzerinde bulunan çizgiyi en tepedeymiş gibi yazdırır. Eşleştirilen çizgiden eşit veya daha az girintili bir çizgide başka bir çizgiyle karşılaşıncaya kadar yazdırmaya devam eder - bu nedenle tüm bölümler içerebilecek tüm alt bölümleri, paragrafları da içeren yalnızca bir başlık eşleştirmesiyle yakalanır.
Temel olarak, bir desenle eşleşmesini isterseniz, bunu sadece bir tür konu başlığına karşı yapar ve eşleşmesinin başlığında bulunan bölümde bulunan tüm metni renklendirir ve yazdırır. İlk satırınızın girintisi dışında hiçbir şey kaydedilmez - ve çok hızlı olabilir ve \n
ewline ayrılmış herhangi bir büyüklükteki girişi ele alabilir.
Aşağıdakiler gibi alt pozisyonlara nasıl tekrar gireceğimi bulmam biraz zaman aldı:
Section Heading
Subsection Heading
Ama sonunda hallettim.
Yine de sadelik uğruna her şeyi elden geçirmek zorunda kaldım. Daha önce aynı şeyleri kendi bağlamlarına uyacak şekilde biraz farklı şekillerde yapan birkaç küçük döngüye girmeden önce, özyineleme yöntemlerini değiştirerek kodun çoğunluğunu kopyalamayı başardım. Şimdi iki döngü var - biri yazdırıyor, diğeri kontrol girinti. Her ikisi de aynı teste bağlıdır - test döngüsü geçtiğinde yazdırma döngüsü başlar ve başarısız olduğunda veya boş bir satırda başladığında girinti döngüsü devreye girer.
Tüm süreç çok hızlı çünkü çoğu zaman /./d
boş olmayan herhangi bir çizgiyi siliyor ve bir sonrakine geçiyor - hatta zshall
ekranın anında doldurulmasından bile kaynaklanıyor . Bu değişmedi.
Neyse, şu ana kadar çok faydalı. Örneğin, read
yukarıdaki şey şöyle yapılabilir:
mansed bash read
... ve tüm bloğu alır. Birincisi her zaman man
arama yapması gereken sayfa olmasına rağmen, herhangi bir desen veya her hangi bir şekilde veya birden fazla argüman alabilir . İşte yaptıktan sonra çıktısının bir kısmı :
mansed bash read printf
... her iki blok da bir bütün olarak geri döndü. Sık sık şöyle kullanırım:
mansed ksh '[Cc]ommand.*'
... oldukça yararlı olduğu için. Ayrıca, almak SYNOPS[ES]
gerçekten çok kullanışlı:
İşte bir koşuşturma vermek istersen - Söylemezsen seni suçlamayacağım.
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
");}
Kısaca, iş akışı:
- boş olmayan ve
\n
ewline karakter içermeyen herhangi bir satır çıktıdan silinir.
\n
ewline karakterleri hiçbir zaman giriş deseni alanında gerçekleşmez. Yalnızca bir düzenlemenin sonucu olabilirler.
:print
ve :indent
her ikisi de karşılıklı olarak bağımlı olan kapalı halkalardır ve \n
ewline elde etmenin tek yoludur .
:print
Bir satırdaki \n
baş karakterlerin ewline karakteriyle başlayan bir dizi boşluk olması durumunda döngü döngüsü başlar .
:indent
döngüsü boş satırlarda - veya :print
başarısız olan döngü satırlarında #test
- ancak :indent
tüm boş + \n
ewline dizilerini çıkışından kaldırır .
- Bir kez
:print
başladıktan sonra, giriş hatlarını çekmeye devam edecek, öncü boşluk alanını çevrimindeki ilk satırda bulunan miktara kadar soyun, aşırı gerilmeyi çevirip geri tepme kaçışlarını renkli terminal kaçışlarına çevirip #test
başarısız olana kadar yazdırın .
- önce
:indent
başlamadan önce h
herhangi bir olası girinti devamı (Altbölüm gibi) için eski alanı kontrol eder ve sonra #test
başarısız olduğu sürece girdi çekmeye devam eder ve ilkini izleyen herhangi bir satır eşleşmeye devam eder [-
. İlk satırdan sonraki bir satır bu modelle eşleşmediğinde silinir - ve ardından bir sonraki boş satıra kadar olan tüm satırlar takip eder.
#match
ve #test
iki kapalı döngüyü köprüleyin.
#test
\n
Öndeki boşluk serileri, satır dizisindeki son satırın arkasındaki diziden daha kısa olduğunda geçer .
#match
herhangi bir komut satırı \n
argümanı ile eşleşmeye yol açan herhangi bir çıkış dizisine bir :print
döngüye başlamak için gerekli olan öncü hatları hazırlar :indent
. Boş bırakılmayan diziler - ve sonuçta ortaya çıkan boş satır geri döndürülür :indent
.