Alle Shell-Buildins haben dieselbe Handbuchseite:
BUILTIN(1) BSD General Commands Manual BUILTIN(1)
NAME
builtin, !
etc.
Dann gibt es einen kleinen Text, der beschreibt, was Shell-Builtins sind, und dann eine Liste, die ungefähr so aussieht:
Command External csh(1) sh(1)
! No No Yes
% No Yes No
Aber wenn wir das tun man grep
, bekommen wir Abschnitte wie
- Bugs
- Geschichte
- Siehe auch
- Standards
- Beschreibung
etc.
Haben Shell-Buildins nicht ihre eigene Geschichte, Beschreibung und Argumentation wie -A
oder -r
? Warum ist das in den Handbuchseiten nicht angegeben und wie würde ich lernen, sie richtig und effizient zu verwenden?
command-line
osx
freebsd
man
Anzeigename
quelle
quelle
Antworten:
Weil Builtins Teil der Shell sind. Alle Fehler oder die Historie, die sie haben, sind Fehler und die Historie der Shell. Sie sind keine unabhängigen Befehle und existieren nicht außerhalb der Shell, in die sie eingebaut sind.
bash
Zumindest das Äquivalent ist derhelp
Befehl. Beispielsweise:Alle Bash-Buildins haben
help
Seiten. Sogarhelp
selbst:Inspiriert von @ mikeservs
sed
Skript ist hier eine kleine Funktion, die den relevanten Abschnitt einer Manpage mit Perl druckt. Fügen Sie diese Zeile zur Initialisierungsdatei Ihrer Shell hinzu (~/.bashrc
für bash):Dann führen Sie es aus, indem Sie ihm eine Manpage und den Namen eines Abschnitts geben:
quelle
SHELL BUILTIN COMMANDS
Abschnitt derbash
Manpage erklärt. Ihre "Manpages" sindhelp builtin_name
.man git commit
eine Manpage für aufgerufen wirdgit-commit
. Sowasman bash if
wäre wunderbar .Es ist zwar richtig, dass einige Shell - Buildins in einem vollständigen Handbuch nur einen geringen Umfang aufweisen können - insbesondere für diejenigen -
bash
spezifischen Buildins, die Sie wahrscheinlich nur auf einem GNU - System verwenden (die GNU - Leute glauben in der Regel nicht anman
und) bevorzugen ihre eigeneninfo
Seiten) - die überwiegende Mehrheit der POSIX-Dienstprogramme - Shell-Builtins oder andere - sind im POSIX-Programmierhandbuch sehr gut vertreten.Hier ist ein Auszug aus dem unteren Teil von meinem
man sh
(der wahrscheinlich 20 Seiten lang ist oder so ...)Alle diese sind da, und andere wie nicht erwähnt
set
,read
,break
... na ja, brauche ich nicht , sie alle zu nennen. Beachten Sie jedoch die(1P)
unten rechts angezeigte POSIX-Handbuchserie der Kategorie 1 - das sind dieman
Seiten, über die ich spreche.Es kann sein, dass Sie nur ein Paket installieren müssen? Dies sieht für ein Debian-System vielversprechend aus. Während
help
es nützlich ist, wenn Sie es finden können, sollten Sie auf jeden Fall diesePOSIX Programmer's Guide
Serie bekommen. Das kann sehr hilfreich sein. Die einzelnen Seiten sind sehr detailliert.Abgesehen davon werden Shell-Builtins fast immer in einem bestimmten Abschnitt des jeweiligen Shell-Handbuchs aufgeführt.
zsh
Zum Beispiel hat eine ganze separateman
Seite dafür - (ich denke, es summiert sich auf 8 oder 9 oder so einzelnezsh
Seiten - einschließlich der,zshall
die riesig ist.)Sie können nur
grep
man
natürlich nur:... was ziemlich genau dem entspricht, was ich früher beim Durchsuchen einer Shell gemacht habe
man
Seite gemacht habe. Aberhelp
ist ziemlich gut inbash
in den meisten Fällen.Ich habe in
sed
letzter Zeit tatsächlich an einem Skript gearbeitet, um mit solchen Dingen umzugehen. So habe ich den Abschnitt im Bild oben aufgenommen. Es ist immer noch länger als ich es mag, aber es verbessert sich - und es kann ziemlich praktisch sein. In seiner aktuellen Iteration wird es einen kontextsensitiven Textabschnitt ziemlich zuverlässig extrahieren, der mit einem Abschnitt oder einer Unterabschnittsüberschrift übereinstimmt, basierend auf [a] pattern [s], das es in der Befehlszeile gibt. Es färbt seine Ausgabe und druckt nach Standard.Es funktioniert durch Auswerten von Einzugsebenen. Nicht-leere Eingabezeilen werden im Allgemeinen ignoriert, aber wenn sie auf eine leere Zeile treffen, beginnt sie zu achten. Von dort sammelt es Zeilen, bis es überprüft hat, dass die aktuelle Sequenz definitiv weiter eingerückt ist als die erste Zeile, bevor eine weitere Leerzeile auftritt, oder es löscht den Thread und wartet auf das nächste Leerzeichen. Wenn der Test erfolgreich ist, wird versucht, die Führungslinie mit ihren Befehlszeilenargumenten abzugleichen.
Dies bedeutet, dass ein Übereinstimmungsmuster übereinstimmt mit:
..und..
..aber nicht..
..oder..
Wenn eine Übereinstimmung gefunden werden kann, wird der Druckvorgang gestartet. Dabei werden die führenden Leerzeichen der übereinstimmenden Zeile aus allen gedruckten Zeilen entfernt. Unabhängig von der Einrückungsstufe wird diese Zeile so gedruckt, als befänden sie sich oben. Es wird so lange gedruckt, bis es auf eine andere Zeile stößt, deren Einzug gleich oder geringer ist als der der übereinstimmenden Zeile. Daher werden ganze Abschnitte mit nur einer Überschriftenübereinstimmung erfasst, einschließlich aller Unterabschnitte und Absätze, die sie möglicherweise enthalten.
Wenn Sie also darum bitten, ein Muster abzugleichen, wird dies nur für eine Betreff-Überschrift durchgeführt und der gesamte Text innerhalb des Abschnitts mit der Überschrift für die Übereinstimmung wird gefärbt und gedruckt. Dabei wird nichts außer dem Einzug der ersten Zeile gespeichert. Dies ist sehr schnell und ermöglicht die Verarbeitung von
\n
E-Line-getrennten Eingaben in praktisch jeder Größe.Es dauerte eine Weile, bis ich herausgefunden hatte, wie ich mich in Unterüberschriften wie die folgenden einteilen konnte:
Aber ich habe es irgendwann geklärt.
Der Einfachheit halber musste ich das Ganze jedoch überarbeiten. Während ich zuvor mehrere kleine Schleifen hatte, die zumeist die gleichen Dinge auf etwas unterschiedliche Weise taten, um ihrem Kontext zu entsprechen, gelang es mir, durch Variation der Rekursionsmethoden den größten Teil des Codes zu de-duplizieren. Jetzt gibt es zwei Schleifen - eine druckt und eine prüft den Einzug. Beide hängen von demselben Test ab - die Druckschleife startet, wenn der Test bestanden wird, und die Einrückschleife übernimmt, wenn der Test fehlschlägt oder in einer leeren Zeile beginnt.
Der gesamte Vorgang ist sehr schnell, da in den meisten
/./d
Fällen nur nicht leere Zeilen entfernt und zur nächsten Zeile gewechselt werden. Dies ergibt sich sogar auszshall
dem sofortigen Auffüllen des Bildschirms. Das hat sich nicht geändert.Sowieso ist es bis jetzt sehr nützlich. Zum Beispiel kann das
read
oben Gesagte so gemacht werden:... und es wird der ganze Block. Es kann ein beliebiges Muster oder was auch immer oder mehrere Argumente annehmen, obwohl das erste immer die
man
Seite ist, auf der gesucht werden soll. Hier ist ein Bild von einigen seiner Ausgaben, nachdem ich es getan habe:... beide Blöcke werden als Ganzes zurückgegeben. Ich benutze es oft wie:
... wofür es ganz nützlich ist. Außerdem
SYNOPS[ES]
macht das Erhalten es wirklich praktisch:Hier ist es, wenn Sie es versuchen wollen - ich werde Ihnen keine Vorwürfe machen, wenn Sie es nicht tun.
Kurz gesagt, der Workflow ist:
\n
ewline-Zeichen enthält, wird aus der Ausgabe gelöscht.\n
ewline-Zeichen kommen im Eingabemusterraum nie vor. Sie können nur als Ergebnis einer Bearbeitung erhalten werden.:print
und:indent
sind beide voneinander abhängige geschlossene Schleifen und der einzige Weg, eine\n
ewline zu erhalten .:print
Der Schleifenzyklus von beginnt, wenn die führenden Zeichen in einer Zeile eine Reihe von Leerzeichen gefolgt von einem\n
ewline-Zeichen sind.:indent
Der Zyklus beginnt in Leerzeilen - oder in:print
Zykluszeilen, die fehlschlagen#test
-,:indent
entfernt jedoch alle führenden Leerzeichen +\n
ewline-Sequenzen aus der Ausgabe.:print
Vorgang beginnt, werden die Eingabezeilen weiter eingezogen, führende Leerzeichen werden bis zu dem in der ersten Zeile des Zyklus angegebenen Wert entfernt, Über- und Unterstriche werden in Farbausblendungen umgewandelt und die Ergebnisse werden gedruckt, bis der#test
Vorgang fehlschlägt.:indent
starts prüft zuerst denh
alten Speicherplatz auf mögliche Einrückungsfortsetzungen (z. B. einen Unterabschnitt) und zieht dann die Eingabe weiter ein, solange dies#test
fehlschlägt und jede Zeile, die auf die erste folgt, weiterhin übereinstimmt[-
. Wenn eine Zeile nach der ersten nicht mit diesem Muster übereinstimmt, wird sie gelöscht. Anschließend werden alle folgenden Zeilen bis zur nächsten leeren Zeile gelöscht.#match
und#test
überbrücken Sie die beiden geschlossenen Schleifen.#test
wird ausgeführt, wenn die führende Reihe von Leerzeichen kürzer ist als die Reihe, gefolgt von der letzten\n
ewline in einer Zeilenfolge.#match
Stellt die führenden\n
E- Zeilen, die zum Starten eines:print
Zyklus benötigt werden, vor die:indent
Ausgabesequenzen, die zu einer Übereinstimmung mit einem Befehlszeilenargument führen. Die Sequenzen, die nicht leer gerendert werden - und die resultierende Leerzeile wird an zurückgegeben:indent
.quelle
manperl(){ man $1 | perl -00ne "print if /^\s*$2\b/"; }
und dannmanperl sh SYNOPSIS
oder machenmanperl sh read
:)sed 'H;$!d;g;s/\(\(\n *\)match\([^\n]*\)\2 \)\{1,\}\)*.\{,1\}/\1/g'
... wahrscheinlich funktioniert das ... aber dazu muss man die Datei schlucken und alles auf einmal analysieren. Dies funktioniert in einem Stream - er kann Eingaben jeder Größe verarbeiten, sofern die Zeilen nicht astronomisch lang sind. Er druckt , wie es funktioniert - und es analysiert alleman
‚s\b
ackslash Fluchten zu booten. Aber esman
ist nur eine einzige Anwendung - ich habe viel davon auch auf andere Probleme angewendet ...\n\n
statt ,\n
aber immer noch jede Größe Eingang verarbeiten können und druckt wie es funktioniert. Siehe " Absatzmodussed
ihm kann wie geschehen:'/./{H;$!d' -e '};x;now work the paragraph...'
. Das mache ich auch oft. Aber ich habe ursprünglich den ersten Teil geschrieben, in dem ich ein Protokoll unbegrenzt lange live gesehen habe, und selbst dieses Verhalten war zweifelhaft - der Puffer kann unter bestimmten Bedingungen explodieren. Das war nur halb so groß -man
machte es schwerer. Ich habeman -H
nach derman
obigen Zusammenfassung nachgesehen und denke, es könnte einfacher sein, mit dem maschinengeschriebenen HTML-Code zu arbeiten, den groff auf GNU-Systemen drucken kann. Ich bin schon ein bisschen bogentiefmansed cmd DESCRIPTION
gets DESCRIPTION section - und alle enthaltenen. Eine übereinstimmende Suche wird als Ganzes gedruckt und als ob ihre Einrückungsstufe die oberste war. Es werden sogar falsche Positive übersprungen, indem übereinstimmende Absätze ignoriert, aber nicht weiter eingerückt werden. Es passt seine Argumente an, indem die Farbe entweicht und diese nicht verarbeitet, bis es definitiv bereit ist, eine Zeile zu drucken. All das fällt mir sehr schwer, mit viel mehr Daten als einer einzelnen Zeile gleichzeitig fertig zu werden.Jede Shell hat ihre eigenen Buildins. Es gibt zwar Gemeinsamkeiten, aber jede hat ihre eigenen Besonderheiten, die dokumentiert werden müssen.
Auf Systemen wie Linux und FreeBSD (und OSX, das von FreeBSD erbt), auf denen jede Shell als separates Paket bereitgestellt wird, gibt es keine Manpage für Builtins. Stattdessen wird jedes eingebaute Element in der Manpage der Shell dokumentiert. Lesen Sie also die bash-Manpage für die Dokumentation von Bashs
kill
Builtin, die dash-Manpage für die Dokumentation vonkill
Dashs Builtin usw. Es gibt auch eine Manpage für daskill
Standalone-Dienstprogramm.Siehe Kann ich einzelne Manpages für die in Bash eingebauten Befehle erhalten? für eine
man
Funktion, die die interne Dokumentation von bash anstelle der Manpage anzeigt, wenn das Argument der Name eines eingebauten Elements ist.Es gibt Unix-Varianten, die Manpages für Shell-Buildins bereitstellen - in der Tat tun es die meisten kommerziellen Varianten. Dies ist möglich, da das System entweder mit einer einzelnen Shell oder einer Reihe bekannter Shells geliefert wird. In der Manpage werden die Unterschiede zwischen den Shells erläutert. Zum Beispiel kann die
fg(1)
Manpage auf Solaris 10 hat Abschnitte fürsh
,ksh
undcsh
. Diefg(1)
Manpage unter AIX 7.1 verweist auf „Korn-Shell“ und „POSIX-Shell“, erläutert sie jedoch gemeinsam (sie unterstützen zufällig genau dieselben Funktionen fürfg
). In derfg(1)
Manpage zu Tru64 5.0 werden die in ksh integrierten Funktionen erläutert und csh-Benutzer auf diecsh(1)
Manpage verwiesen . SCOanscheinend kommt mit einer einzigen schale. Sie können andere Shells als Add-On-Pakete auf diesen Betriebssystemen installieren. Wenn Sie eine benutzerdefinierte Shell verwenden, müssen Sie beachten, dass die Manpages für Builtins nicht relevant sind, wenn Sie eine nicht standardmäßige Shell verwenden.quelle