Wszystkie wbudowane powłoki współużytkują tę samą stronę podręcznika:
BUILTIN(1) BSD General Commands Manual BUILTIN(1)
NAME
builtin, !
itp.
Następnie jest krótki tekst opisujący, jakie są wbudowane powłoki, a następnie lista, która wygląda mniej więcej tak:
Command External csh(1) sh(1)
! No No Yes
% No Yes No
Ale jeśli to zrobimy man grep
, otrzymamy sekcje takie jak
- Robaki
- Historia
- Zobacz też
- Standardy
- Opis
itp.
Czy wbudowane powłoki nie mają własnej historii, opisu i argumentów takich jak -A
lub -r
? Dlaczego nie ma tego na stronach podręcznika i jak mam nauczyć się korzystać z nich poprawnie i wydajnie?
command-line
osx
freebsd
man
Wyświetlana nazwa
źródło
źródło
Odpowiedzi:
Ponieważ wbudowane są częścią powłoki. Wszelkie błędy lub historia, które mają, są błędami i historią samej powłoki. Nie są to niezależne polecenia i nie istnieją poza powłoką, w której są wbudowane.
Ekwiwalent, na
bash
co najmniej tohelp
polecenie. Na przykład:Wszystkie wbudowane bash mają
help
strony. Nawethelp
sam:Zainspirowany skryptem @ mikeserv
sed
, oto mała funkcja, która wydrukuje odpowiednią sekcję strony podręcznika przy użyciu Perla. Dodaj ten wiersz do pliku inicjalizacji powłoki (~/.bashrc
dla bash):Następnie uruchamiasz go, nadając mu stronę podręcznika i nazwę sekcji:
źródło
SHELL BUILTIN COMMANDS
sekcji strony podręcznikabash
. Ich „stronami podręcznika” sąhelp builtin_name
.man git commit
prowadzi do strony mangit-commit
. Coś takiegoman bash if
byłoby cudowne .Chociaż prawdą jest, że niektóre wbudowane powłoki mogą mieć skąpe wyświetlanie w kompletnym podręczniku - szczególnie dla tych
bash
specyficznych wbudowanych, których prawdopodobnie używasz tylko w systemie GNU (ludzie GNU z reguły nie wierzą wman
i wolą własneinfo
strony) - zdecydowana większość narzędzi POSIX - wbudowane powłoki lub inne - są bardzo dobrze reprezentowane w POSIX Programmer's Guide.Oto fragment z dołu mojego
man sh
(który prawdopodobnie ma około 20 stron ...)Wszystkie te istnieją, a inne nie wymienione, takie jak
set
,read
,break
... dobrze, nie trzeba ich wszystkich wymienić. Ale zwróć uwagę(1P)
na prawy dolny róg - oznacza serię instrukcji POSIX kategorii 1 - toman
strony, o których mówię.Być może wystarczy zainstalować pakiet? To wygląda obiecująco dla systemu Debian. Chociaż
help
jest przydatny, jeśli możesz go znaleźć, zdecydowanie powinieneś dostać tęPOSIX Programmer's Guide
serię. To może być bardzo pomocne. I jego strony składowe są bardzo szczegółowe.Poza tym wbudowane powłoki są prawie zawsze wymienione w konkretnej części podręcznika powłoki.
zsh
, na przykład ma całą osobnąman
stronę do tego - (myślę, że wynosi 8 lub 9 osobnychzsh
stron - w tymzshall
która jest ogromna).Możesz
grep
man
oczywiście:... co jest bardzo podobne do tego, co robiłem podczas przeszukiwania
man
strony powłoki . Ale w większości przypadkówhelp
jest całkiem dobrybash
.sed
Ostatnio pracowałem nad skryptem do obsługi tego rodzaju rzeczy. W ten sposób złapałem sekcję na powyższym obrazku. Jest jeszcze dłuższy niż lubię, ale poprawia się - i może być całkiem przydatny. W bieżącej iteracji całkiem niezawodnie wyodrębni kontekstową sekcję tekstu dopasowaną do nagłówka sekcji lub podsekcji na podstawie wzorca [a] podanego w wierszu poleceń. Koloruje wydruki i drukuje na standardowym ekranie.Działa poprzez ocenę poziomów wcięć. Niepuste linie wejściowe są na ogół ignorowane, ale gdy napotka pustą linię, zaczyna zwracać uwagę. Stamtąd zbiera linie, dopóki nie zweryfikuje, że bieżąca sekwencja zdecydowanie wcina się dalej niż pierwsza linia, zanim pojawi się kolejna pusta linia, albo upuści wątek i czeka na następny pusty wiersz. Jeśli test się powiedzie, próbuje dopasować linię wiodącą do argumentów wiersza poleceń.
Oznacza to, że mecz wzorca pasują:
..i..
..ale nie..
..lub..
Jeśli można dopasować, rozpocznie się drukowanie. Spowoduje to usunięcie wiodących odstępów dopasowanej linii ze wszystkich drukowanych linii - więc bez względu na poziom wcięcia, który znalazł, linia na nim drukuje go tak, jakby znajdowała się na górze. Będzie kontynuował drukowanie, dopóki nie napotka innej linii na poziomie równym lub mniejszym niż wcięcie niż dopasowana linia - więc całe sekcje są chwytane tylko z dopasowaniem nagłówka, w tym wszystkie / wszystkie podsekcje, akapity, które mogą zawierać.
Zasadniczo, jeśli poprosisz go o dopasowanie wzoru, zrobi to tylko w odniesieniu do jakiegoś nagłówka tematu i pokoloruje i wydrukuje cały tekst, który znajdzie w sekcji, której nagłówek odpowiada. Nic nie jest zapisywane, ponieważ robi to, z wyjątkiem wcięcia w pierwszym wierszu - dzięki czemu może być bardzo szybki i obsługiwać
\n
dane oddzielone ewline praktycznie dowolnego rozmiaru.Chwilę zajęło mi wymyślenie, w jaki sposób powrócić do podtytułów, takich jak:
Ale w końcu to rozwiązałem.
Jednak dla uproszczenia musiałem to wszystko przerobić. Podczas gdy wcześniej miałem kilka małych pętli wykonujących głównie te same rzeczy w nieco inny sposób, aby dopasować się do ich kontekstu, zmieniając sposoby rekurencji udało mi się zduplikować większość kodu. Teraz są dwie pętle - jedna drukuje, a druga sprawdza wcięcie. Oba zależą od tego samego testu - pętla drukująca rozpoczyna się po przejściu testu, a pętla wcięcia przejmuje kontrolę, gdy kończy się niepowodzeniem lub zaczyna się od pustej linii.
Cały proces jest bardzo szybki, ponieważ przez większość czasu po prostu
/./d
usuwa niepustą linię i przechodzi do następnego - nawet wynikizshall
natychmiastowego zapełniania ekranu. To się nie zmieniło.W każdym razie jest to bardzo przydatne. Na przykład
read
powyższe czynności można wykonać w następujący sposób:... i dostaje cały blok. Może przyjmować dowolne wzorce lub cokolwiek, lub wiele argumentów, chociaż pierwszy to zawsze
man
strona, na której powinien szukać. Oto zdjęcie niektórych jego wyników po tym, jak to zrobiłem:... oba bloki są zwracane w całości. Często używam go w następujący sposób:
... do czego jest całkiem użyteczny. Ponadto uzyskiwanie
SYNOPS[ES]
sprawia, że jest to naprawdę przydatne:Oto, jeśli chcesz dać mu wir - nie obwiniam cię, jeśli tego nie zrobisz.
W skrócie, przepływ pracy to:
\n
znaku ewline, jest usuwany z wyniku.\n
znaki ewline nigdy nie występują w wejściowym obszarze wzorca. Można je uzyskać tylko w wyniku edycji.:print
i:indent
oba są wzajemnie zależnymi zamkniętymi pętlami i są jedynym sposobem na uzyskanie\n
ewline.:print
Cykl pętli rozpoczyna się, jeśli wiodącymi znakami w linii są ciągi\n
odstępów, po których następuje znak ewline.:indent
Cykl rozpoczyna się na pustych liniach - lub na:print
liniach cyklicznych, które zawodzą#test
- ale:indent
usuwa wszystkie wiodące puste\n
sekwencje + ewline z jego wyniku.:print
zacznie, nadal będzie ciągnąć linie wejściowe, usuwać wiodące białe znaki do wartości znalezionej na pierwszym wierszu w swoim cyklu, tłumaczyć przeciążenie przecięcia i cofnięcia podskoku na kolorowe zaciski i drukować wyniki aż do#test
niepowodzenia.:indent
rozpoczęciem najpierw sprawdzah
stare miejsce pod kątem ewentualnej kontynuacji wcięcia (takiego jak podsekcja) , a następnie kontynuuje pobieranie danych wejściowych tak długo, jak długo#test
kończy się niepowodzeniem, a dowolna linia następująca po pierwszej kontynuuje dopasowanie[-
. Gdy wiersz po pierwszym nie pasuje do tego wzorca, jest usuwany - a następnie wszystkie kolejne wiersze aż do następnej pustej linii.#match
i#test
zmostkuj dwie zamknięte pętle.#test
przechodzi, gdy wiodąca seria\n
odstępów jest krótsza niż seria, po której następuje ostatnia ewline w sekwencji linii.#match
przygotowuje wiodące\n
ewline potrzebne do rozpoczęcia:print
cyklu do dowolnej:indent
sekwencji wyjściowej, która prowadzi z dopasowaniem do dowolnego argumentu wiersza poleceń. Sekwencje, które nie są renderowane jako puste - i wynikowy pusty wiersz jest przekazywany z powrotem do:indent
.źródło
manperl(){ man $1 | perl -00ne "print if /^\s*$2\b/"; }
a potemmanperl sh SYNOPSIS
lubmanperl sh read
:)sed 'H;$!d;g;s/\(\(\n *\)match\([^\n]*\)\2 \)\{1,\}\)*.\{,1\}/\1/g'
... pewnie to działa ... ale to wymaga połknięcia pliku i parsowania go naraz. Działa to w strumieniu - może obsłużyć dane wejściowe o dowolnym rozmiarze, pod warunkiem, że linie nie są astronomicznie długie. Drukuje jak to działa - i analizuje wszystkieman
„s\b
ackslash ucieka do rozruchu. Aleman
to tylko jedna aplikacja - zastosowałem wiele z nich również do innych problemów ...\n\n
zamiast,\n
ale nadal może obsłużyć dane wejściowe dowolnego rozmiaru i drukuje, gdy to działa. Zobacz „tryb akapitowy” tutaj: perldoc.perl.org/perlrun.htmlsed
nim można zrobić tak:'/./{H;$!d' -e '};x;now work the paragraph...'
. Często też to robię. Ale pierwotnie napisałem pierwszą część do oglądania dziennika na żywo przez nieograniczoną ilość czasu, a nawet to zachowanie było niepewne - bufor może wybuchnąć pod pewnymi warunkami. To tylko połowa tego rozmiaru -man
to utrudniło. Spojrzałem jednakman -H
po otrzymaniuman
powyższego podsumowania i myślę, że może być łatwiej pracować z generowanym maszynowo językiem HTML, który groff może wydrukować w systemach GNU. Jestem trochę jak łokieć już tymansed cmd DESCRIPTION
pobiera sekcja OPIS - i wszystkie zawarte. Dopasowane wyszukiwanie jest drukowane w całości i tak, jakby jego poziom wcięcia był najwyższy. Pomija nawet fałszywe alarmy, ignorując pasujące akapity, ale nie wcina się dalej. Dopasowuje swoje argumenty poprzez kolor ucieczki koloru i nie obsługuje ich, dopóki nie jest zdecydowanie gotowy do wydrukowania linii. Wszystko to jest dla mnie bardzo trudne do zrobienia z większą ilością danych niż pojedyncza linia na raz.Każda powłoka ma swój własny zestaw wbudowanych funkcji. Chociaż istnieją podobieństwa, każda z nich ma swoje osobliwości, które należy udokumentować.
W systemach takich jak Linux i FreeBSD (i OSX, który dziedziczy po FreeBSD), gdzie każda powłoka jest dostarczana jako osobny pakiet, nie ma strony podręcznika dla wbudowanych; zamiast tego każde wbudowane jest udokumentowane na stronie man powłoki. Przeczytaj więc stronę podręcznika użytkownika bash, aby uzyskać dokumentację
kill
wbudowanego narzędzia bash , przeczytaj stronę podręcznika dash, aby uzyskać dokumentacjękill
wbudowanego narzędzia dash itp. Istnieje również strona podręcznika dlakill
samodzielnego narzędzia.Zobacz: Czy mogę uzyskać pojedyncze strony podręcznika dla wbudowanych poleceń bash? dla
man
funkcji, która pokazuje wewnętrzną dokumentację bash zamiast strony man, jeśli argument jest nazwą wbudowanego.Istnieją warianty unixowe, które zapewniają strony podręcznika dla wbudowanych powłok - w rzeczywistości większość wariantów komercyjnych to robi. Jest to wykonalne, ponieważ system jest wyposażony w pojedynczą powłokę lub zestaw znanych powłok. Strona podręcznika omawia różnice między powłokami. Na przykład,
fg(1)
strona człowiek na Solaris 10 ma sekcjesh
,ksh
icsh
.fg(1)
Strona człowiek na AIX 7.1 odniesień „Korn shell” i „POSIX Shell”, ale omawia je ze sobą (zdarzają się wspierać dokładnie te same funkcjefg
).fg(1)
Strona człowiek na Tru64 5,0 omawia wbudowane ksh i csh odsyła użytkowników docsh(1)
strony człowieka. SCOnajwyraźniej ma jedną powłokę. Możesz zainstalować inne powłoki jako pakiety dodatkowe w tych systemach operacyjnych; jeśli używasz niestandardowej powłoki, musisz pamiętać, że strony podręcznika dla wbudowanych poleceń nie będą odpowiednie, gdy używasz powłoki innej niż domyślna.źródło