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 pas man
et préfèrent leurs propres info
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 les man
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 cette POSIX 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 une man
page entièrement séparée pour cela - (je pense qu’elle totalise environ 8 ou 9 zsh
pages individuelles - zshall
ce qui est énorme.)
Vous pouvez grep
man
bien sûr:
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
... ce qui est assez proche de ce que je faisais lorsque je cherchais une man
page shell . Mais help
c'est très bien bash
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:
heading
match ...
...
...
text...
..et..
match
text
..mais non..
heading
match
match
notmatch
..ou..
text
match
match
text
more text
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:
Section Heading
Subsection Heading
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és zshall
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:
mansed bash read
... 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:
mansed bash read printf
... les deux blocs sont retournés entiers. Je l'utilise souvent comme:
mansed ksh '[Cc]ommand.*'
... 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.
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
");}
En bref, le flux de travail est:
- toute ligne qui n'est pas vide et qui ne contient pas de
\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.
- une fois
: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.
- avant de
: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
.