Toutes les commandes intégrées au shell partagent la même page de manuel:
BUILTIN(1) BSD General Commands Manual BUILTIN(1)
NAME
builtin, !
etc.
Ensuite, il y a un petit texte décrivant ce que sont les éléments intégrés au shell, puis une liste qui ressemble à ceci:
Command External csh(1) sh(1)
! No No Yes
% No Yes No
Mais si nous man grep
obtenons nous obtenons des sections telles que
- Bogues
- Histoire
- Voir également
- Normes
- La description
etc.
Les commandes intégrées au shell n'ont-elles pas leur propre histoire, description et arguments tels que -A
ou -r
? Pourquoi n'est-ce pas fourni dans les pages de manuel et comment pourrais-je apprendre à les utiliser correctement et efficacement?
command-line
osx
freebsd
man
Afficher un nom
la source
la source
Réponses:
Parce que les éléments intégrés font partie de la coque. Tous les bugs ou leur histoire sont des bugs et l’histoire du shell lui-même. Ce ne sont pas des commandes indépendantes et n'existent pas en dehors du shell dans lequel elles sont construites.
L'équivalent,
bash
au moins, est lahelp
commande. Par exemple:Tous les programmes intégrés bash ont des
help
pages. Mêmehelp
lui-même:Inspiré du
sed
script de @ mikeserv , voici une petite fonction permettant d’imprimer la section pertinente d’une page de manuel à l’aide de Perl. Ajoutez cette ligne au fichier d’initialisation de votre shell (~/.bashrc
pour bash):Ensuite, vous l’exécutez en lui donnant une page de manuel et le nom d’une section:
la source
SHELL BUILTIN COMMANDS
section de labash
page de manuel. Leurs "pages de manuel" sonthelp builtin_name
.man git commit
affiche une page de manuel pourgit-commit
. Quelque chose comme ceman bash if
serait merveilleux .Il est vrai que certaines commandes intégrées dans un shell peuvent ne figurer que dans un manuel complet - en particulier pour les commandes
bash
spécifiques à une utilisation spécifique que vous ne pourrez utiliser que sur un système GNU (en général, ne croyez pasman
et préfèrent leurs propresinfo
pages) - la grande majorité des utilitaires POSIX - intégrés au shell ou autrement - sont très bien représentés dans le Guide du programmeur POSIX.Voici un extrait du bas de ma page
man sh
(qui fait probablement environ 20 pages ...)Tous ces éléments sont là, et d' autres ne sont pas mentionnés tels que
set
,read
,break
... eh bien, je ne ai pas besoin de les nommer tous. Mais notez le(1P)
en bas à droite - il désigne la série de manuels POSIX de catégorie 1 - ce sont lesman
pages dont je parle.Il se peut que vous ayez juste besoin d'installer un paquet? Cela semble prometteur pour un système Debian. Bien que ce
help
soit utile, si vous pouvez le trouver, vous devriez absolument avoir cettePOSIX Programmer's Guide
série. Cela peut être extrêmement utile. Et ses pages constitutives sont très détaillées.Cela dit, les commandes intégrées au shell sont presque toujours répertoriées dans une section spécifique du manuel du shell.
zsh
, par exemple, a uneman
page entièrement séparée pour cela - (je pense qu’elle totalise environ 8 ou 9zsh
pages individuelles -zshall
ce qui est énorme.)Vous pouvez
grep
man
bien sûr:... ce qui est assez proche de ce que je faisais lorsque je cherchais une
man
page shell . Maishelp
c'est très bienbash
dans la plupart des cas.Je travaille actuellement sur un
sed
script pour gérer ce genre de choses récemment. C'est ainsi que j'ai saisi la section de l'image ci-dessus. C'est encore plus long que je ne le souhaite, mais cela s'améliore - et peut être très pratique. Dans son itération actuelle, il va extraire de manière assez fiable une section de texte sensible au contexte correspondant à un en-tête de section ou de sous-section en fonction de [un] motif [s] donné sur la ligne de commande. Il colore sa sortie et l’imprime sur la sortie standard.Cela fonctionne en évaluant les niveaux de retrait. Les lignes d'entrée non vierges sont généralement ignorées, mais lorsqu'elles rencontrent une ligne vierge, elles commencent à attirer l'attention. Il en rassemble les lignes jusqu'à ce qu'il ait vérifié que la séquence en cours est définitivement plus indentée que sa première ligne avant qu'une autre ligne vide ne se produise, sinon il supprime le fil et attend le prochain blanc. Si le test réussit, il tente de faire correspondre la ligne principale avec ses arguments de ligne de commande.
Cela signifie qu'un match de motif sera Match:
..et..
..mais non..
..ou..
Si une correspondance peut être obtenue, elle commence à imprimer. Elle supprime toutes les lignes vierges des espaces vides de la ligne correspondante. Ainsi, quel que soit le niveau de retrait, elle trouve cette ligne imprimée comme si elle se trouvait en haut. Il continuera à imprimer jusqu'à ce qu'il rencontre une autre ligne d'un niveau égal ou inférieur à celui de la ligne correspondante. Ainsi, des sections entières sont capturées avec uniquement une correspondance de titre, y compris une ou toutes les sous-sections qu'elles peuvent contenir.
En gros, si vous lui demandez de faire correspondre un motif, il le fera uniquement contre un en-tête de sujet et colorera et imprimera tout le texte trouvé dans la section précédée de sa correspondance. Rien n'est enregistré car cela fait cela, sauf l'indentation de votre première ligne. Elle peut donc être très rapide et gérer
\n
des entrées séparées par ewline de toutes les tailles.Il m'a fallu un certain temps pour comprendre comment rentrer dans les sous-titres suivants:
Mais j'ai finalement résolu le problème.
J'ai dû retravailler le tout pour des raisons de simplicité, cependant. Alors qu'avant j'avais plusieurs petites boucles faisant la plupart du temps les mêmes choses de manières légèrement différentes pour s'adapter à leur contexte, en faisant varier les méthodes de récurrence, j'ai réussi à dédupliquer la majorité du code. Maintenant, il y a deux boucles: une en impression et une en retrait. Les deux dépendent du même test - la boucle d'impression commence lorsque le test est réussi et la boucle d'indentation prend le relais en cas d'échec ou de début d'une ligne vierge.
L'ensemble du processus est très rapide, car la plupart du temps, il
/./d
supprime simplement les lignes non vierges et passe à la suivante - les résultats sont même générészshall
instantanément à l'écran. Cela n'a pas changé.Quoi qu'il en soit, c'est très utile jusqu'à présent, cependant. Par exemple, la
read
chose ci-dessus peut être faite comme:... et ça fait tout le bloc. Cela peut prendre n'importe quel modèle, peu importe, ou plusieurs arguments, bien que le premier soit toujours la
man
page dans laquelle il doit chercher. Voici une image de certaines de ses sorties après que je l'ai fait:... les deux blocs sont retournés entiers. Je l'utilise souvent comme:
... pour lequel c'est très utile. De plus, obtenir le
SYNOPS[ES]
rend vraiment pratique:La voici si vous voulez faire un tourbillon - je ne vous blâmerai pas si vous ne le faites pas.
En bref, le flux de travail est:
\n
caractère ewline est supprimée de la sortie.\n
Les caractères de ligne de texte ne se produisent jamais dans l'espace du modèle d'entrée. Ils ne peuvent être obtenus qu'à la suite d'une modification.:print
et:indent
sont à la fois des boucles fermées mutuellement dépendantes et sont le seul moyen d'obtenir une\n
ewline.:print
Le cycle de la boucle commence si les premiers caractères d'une ligne sont une série de blancs suivis d'un\n
caractère de ligne de ligne.:indent
Le cycle de commence sur les lignes vierges - ou sur les:print
lignes de cycle qui échouent#test
- mais:indent
supprime toutes les\n
séquences vierges + lignes principales de sa sortie.:print
qu’il commence, il continue à insérer les lignes d’entrée, à éliminer les espaces blancs jusqu’à la valeur trouvée sur la première ligne de son cycle, à traduire la surimpression et les échappements arrière en suréchantillons en sorties couleur et à imprimer les résultats jusqu’à#test
échec.:indent
commencer, il vérifie d'abord l'h
ancien espace pour la poursuite de l'indentation éventuelle (telle qu'une sous-section) , puis continue à extraire l'entrée tant que la ligne#test
échoue et que toute ligne suivant la première continue à correspondre[-
. Lorsqu'une ligne après la première ne correspond pas à ce modèle, elle est supprimée et toutes les lignes suivantes le sont ensuite jusqu'à la ligne vierge suivante.#match
et#test
pontez les deux boucles fermées.#test
passe lorsque la première série de blancs est plus courte que la série suivie de la dernière\n
ligne d'une ligne.#match
ajoute au\n
début des étapes les lignes principales nécessaires au début d'un:print
cycle à l'une des:indent
séquences de sortie de qui correspondent à un argument de ligne de commande. Les séquences qui ne le sont pas sont rendues vides - et la ligne vide résultante est renvoyée à:indent
.la source
manperl(){ man $1 | perl -00ne "print if /^\s*$2\b/"; }
et ensuitemanperl sh SYNOPSIS
oumanperl sh read
:)sed 'H;$!d;g;s/\(\(\n *\)match\([^\n]*\)\2 \)\{1,\}\)*.\{,1\}/\1/g'
… probablement que cela fonctionne… mais cela nécessite d’avaler le fichier et de l’analyser en une fois. Cela fonctionne dans un flux - il peut gérer une entrée de n'importe quelle taille à condition que les lignes ne soient pas astronomiquement longues. Il imprime comme il fonctionne - et il analyse toutesman
les\b
échappements ackslash pour démarrer. Mais ceman
n’est qu’une application unique - j’en ai appliqué une grande partie à d’autres problèmes ...\n\n
au lieu de,\n
mais peut toujours gérer une entrée de taille et imprime comme il fonctionne Voir "mode paragraphe" ici: perldoc.perl.org/perlrun.htmlsed
ce qui peut être fait comme:'/./{H;$!d' -e '};x;now work the paragraph...'
. Je le fais souvent aussi. Mais j’avais initialement écrit la première partie pour regarder un journal en direct pendant une durée illimitée, et même ce comportement était douteux - la mémoire tampon peut exploser dans certaines conditions. Ce n'était que la moitié de cette taille - leman
rendait plus difficile. Cependant, j'ai regardéman -H
après avoir obtenu laman
synop ci-dessus, et je pense qu'il serait peut-être plus facile de travailler avec le code HTML généré par la machine que groff peut imprimer sur les systèmes GNU. Je suis déjà au coude à coudemansed cmd DESCRIPTION
obtient la section DESCRIPTION - et tous ceux inclus. Une recherche correspondante est imprimée entière et comme si son niveau de retrait était le premier. Il ignore même les faux positifs en ignorant les paragraphes qui correspondent mais qui ne sont pas indentés davantage. Il correspond à ses arguments grâce aux échappements de retour de couleur et ne les gère pas jusqu'à ce qu'il soit vraiment prêt à imprimer une ligne. Il m'est très difficile de faire tout cela avec beaucoup plus de données qu'une seule ligne à la fois.Chaque shell a son propre ensemble de commandes intégrées. Bien qu'il y ait des points communs, chacun a ses particularités qui doivent être documentées.
Sur des systèmes tels que Linux et FreeBSD (et OSX, qui hérite de FreeBSD) où chaque shell est fourni dans un package séparé, il n’existe pas de page de manuel pour les éléments intégrés; à la place, chaque élément intégré est documenté dans la page de manuel du shell. Lisez donc la page de manuel bash pour la documentation de la fonction
kill
intégrée de bash , lisez la page de manuel dash pour la documentation de la fonctionkill
intégrée de dash, etc. Il existe également une page de manuel pour l'kill
utilitaire autonome.Voir Puis-je obtenir des pages de manuel individuelles pour les commandes intégrées bash? pour une
man
fonction qui affiche la documentation interne de bash à la place de la page de manuel si l'argument est le nom d'une commande intégrée.Il existe des variantes unix qui fournissent des pages de manuel pour les commandes intégrées au shell - en fait, la plupart des variantes commerciales le sont. C'est faisable car le système est livré avec un seul shell ou un ensemble de shell connus. La page de manuel traite des différences entre les coquilles. Par exemple, la
fg(1)
page de manuel de Solaris 10 contient des sections poursh
,ksh
etcsh
. Lafg(1)
page de manuel sur AIX 7.1 fait référence à «Korn shell» et à «POSIX shell», mais les traite ensemble (ils prennent en charge les mêmes fonctionnalités pourfg
). Lafg(1)
page de manuel de Tru64 5.0 décrit la structure intégrée de ksh et renvoie les utilisateurs de csh à lacsh(1)
page de manuel. SCOvient apparemment avec une seule coquille. Vous pouvez installer d'autres shells en tant que packages complémentaires sur ces systèmes d'exploitation. Si vous utilisez un shell personnalisé, vous devez vous rappeler que les pages de manuel relatives aux commandes intégrées ne seront pas pertinentes si vous utilisez un shell autre que celui par défaut.la source