Você não pode simplesmente executar Parece que você pode executar man foo.gz
man foo.1.gz
, mas usar -l
parece mais limpo. De man man
:
-l, --local-file
Activate 'local' mode. Format and display local manual files
instead of searching through the system's manual collection.
Each manual page argument will be interpreted as an nroff source
file in the correct format. No cat file is produced. If '-' is
listed as one of the arguments, input will be taken from stdin.
When this option is not used, and man fails to find the page
required, before displaying the error message, it attempts to
act as if this option was supplied, using the name as a filename
and looking for an exact match.
Então, seu script deve ser algo como:
#!/usr/bin/env bash
## synopses - extract all synopses in /usr/share/man/man1
## No need to cd into the directory, you can just use globs
for i in /usr/share/man/man1/ajc*.gz; do
## This will print the name of the command.
basename "${i//.1.gz}"
man -l "$i" |
awk '/^SYNOPSIS/{a=1; getline}
(/^[a-zA-z0-9_]/ && a==1){a=0}
(a==1 && /./){print}' | tr -s [:space:]
done
O comando awk
que dou funciona melhor que sua abordagem (teste em man ajc
, por exemplo) e agora também funciona em sinopses com várias linhas. A maioria dos erros que você vê são irrelevantes, outros foram devido à maneira como você lidava com os nomes dos arquivos. Deixe-me saber se este funciona melhor.