La réponse utile de Rici explique bien le problème avec l'approche originale.
Cependant, il y a une autre chose qui mérite d'être mentionnée :
man
La sortie de contient des caractères de contrôle de mise en forme , qui interfèrent avec les recherches textuelles .
Si vous dirigez vers col -b
avant de chercher , ces caractères de contrôle sont supprimés - notez l'effet secondaire que les résultats de la recherche seront également en texte brut.
Cependant, grep
n'est pas le bon outil pour ce travail ; Je suggère d'utiliser awk
comme suit pour obtenir la description de -O
:
man gcc | col -b | awk -v RS= '/^\s+-O\n/'
RS=
(un séparateur d'enregistrement d'entrée vide) est un idiome awk qui divise l'entrée en blocs de lignes non vides, donc faire correspondre l'option au début d'un tel bloc garantit que toutes les lignes comprenant la description de l'option sont retournés.
Si vous avez un awk
de fonctionnalités POSIX uniquement comme BSD/OSX awk
, utilisez cette version :
man gcc | col -b | awk -v RS= '/^[[:blank:]]+-O\n/'
Évidemment, une telle commande est quelque peu lourde à taper, alors trouvez generic bash
fonction manopt
ci-dessous, qui renvoie la description de l'option spécifiée pour la commande spécifiée à partir de son man
pages . (Il peut y avoir des faux positifs et des faux négatifs, mais dans l'ensemble, cela fonctionne plutôt bien.)
Exemples :
manopt gcc O # search `man gcc` for description of `-O`
manopt grep regexp # search `man grep` for description of `--regexp`
manopt find '-exec.*' # search `man find` for all actions _starting with_ '-exec'
bash
fonction manopt()
- placer en ~/.bashrc
, par exemple :
# SYNOPSIS
# manopt command opt
#
# DESCRIPTION
# Returns the portion of COMMAND's man page describing option OPT.
# Note: Result is plain text - formatting is lost.
#
# OPT may be a short option (e.g., -F) or long option (e.g., --fixed-strings);
# specifying the preceding '-' or '--' is OPTIONAL - UNLESS with long option
# names preceded only by *1* '-', such as the actions for the `find` command.
#
# Matching is exact by default; to turn on prefix matching for long options,
# quote the prefix and append '.*', e.g.: `manopt find '-exec.*'` finds
# both '-exec' and 'execdir'.
#
# EXAMPLES
# manopt ls l # same as: manopt ls -l
# manopt sort reverse # same as: manopt sort --reverse
# manopt find -print # MUST prefix with '-' here.
# manopt find '-exec.*' # find options *starting* with '-exec'
manopt() {
local cmd=$1 opt=$2
[[ $opt == -* ]] || { (( ${#opt} == 1 )) && opt="-$opt" || opt="--$opt"; }
man "$cmd" | col -b | awk -v opt="$opt" -v RS= '$0 ~ "(^|,)[[:blank:]]+" opt "([[:punct:][:space:]]|$)"'
}
fish
implémentation de manopt()
:
Contribution d'Ivan Aracki.
function manopt
set -l cmd $argv[1]
set -l opt $argv[2]
if not echo $opt | grep '^-' >/dev/null
if [ (string length $opt) = 1 ]
set opt "-$opt"
else
set opt "--$opt"
end
end
man "$cmd" | col -b | awk -v opt="$opt" -v RS= '$0 ~ "(^|,)[[:blank:]]+" opt "([[:punct:][:space:]]|$)"'
end
Je soupçonne que vous n'avez pas réellement utilisé grep $'-O\n'
, mais plutôt un indicateur reconnu par grep
.
Du point de vue de grep, vous passez simplement un argument, et cet argument commence par un -
donc ça va être interprété comme une option. Vous devez faire quelque chose comme grep -- -O$
pour signaler explicitement la fin de la liste des options, ou grep -e -O$
pour signaler explicitement le modèle en tant que modèle. Dans tous les cas, vous ne pouvez pas inclure une nouvelle ligne dans un modèle car les modèles grep sont en fait des listes de modèles séparés par des caractères de nouvelle ligne, donc l'argument $'foo\n'
est en fait deux modèles, foo
et la chaîne vide, et la chaîne vide correspondra à chaque ligne.
Peut-être avez-vous recherché le drapeau -e
puisque cela prend un motif comme argument, et lui donner une nouvelle ligne comme argument fera que grep trouvera chaque ligne dans tout le fichier.
Pour la plupart des programmes GNU, tels que gcc, vous pouvez trouver le info
interface plus facile à naviguer, car elle comprend des liens de référence, des tables des matières et même des index. Le info gcc
document comprend un index des options, ce qui est très utile. Dans certaines distributions Linux, et de manière quelque peu surprenante puisqu'elles s'appellent elles-mêmes des distributions GNU/linux, il est nécessaire d'installer séparément info
paquets bien que man
les fichiers sont distribués avec le logiciel de base. Le paquet debian/ubuntu contenant le gcc info
les fichiers s'appellent gcc-doc
, par exemple. (L'utilisation du -doc
suffixe au nom du package est assez courant.)
Dans le cas de gcc
vous pouvez rapidement trouver une option en utilisant une commande comme :
info gcc "option index" O
ou
info gcc --index-search=funroll-loops
Pour les programmes avec moins d'options, il est généralement suffisant d'utiliser le -O
d'info choix :
info -O gawk