Por que os títulos das seções das páginas de manual não são completamente aceitáveis?

14

Isso foi testado em El Capitan e na High Sierra de um colega, no terminal padrão (bash).

user@hostname ~ $ man ls | grep "BU"
BUGS
user@hostname ~ $ man ls | grep "BUG"
user@hostname ~ $ 
user@hostname ~ $ man ls | grep "IEEE"
     files in order to be compatible with the IEEE Std 1003.2 (``POSIX.2'')
     The ls utility conforms to IEEE Std 1003.1-2001 (``POSIX.1'').

Para esclarecer: "BUGS" é um título de seção nessas (e várias outras) páginas de manual. Para títulos de seção, o grepping parece funcionar apenas para os 2 primeiros caracteres; isso é consistente em alguns títulos de seção diferentes que tentamos. Para o restante do conteúdo, grepparece funcionar como esperado.

Ssh'd em uma caixa Linux não com sabor BSD (Amazon Linux) e não parece exibir o mesmo comportamento.

O que está acontecendo aqui?

Jonathan Merklin
fonte
Isso é parte da razão pela qual eu odeio o BSD. Ele formata o texto e executa o pager, mesmo quando sua saída é um pipe. E meu pager é vim, então, como Linus me proibiu man foo | grep bar, eu recebo um pipeline sem resposta (e talvez um terminal bagunçado para inicializar). : / mandb man , que é o que você geralmente vê no Linux, é mais sensato.
Muru
unix.stackexchange.com/questions/371062 também é uma questão do MacOS.
JdeBP

Respostas:

15

Você pode ver o que está acontecendo se visualizar os códigos brutos em uma página de manual. Uma maneira de fazer isso é exportar a página do manual para um arquivo e inspecionar seu conteúdo diretamente:

man ls > man.ls
nano man.ls

A palavra "BUGS" se parece com isso no arquivo:

B^HBU^HUG^HGS^HS

Você verá que os cabeçalhos contêm caracteres de formatação; portanto, a palavra inteira "BUGS" não está presente.


Se você deseja acessar o conteúdo de texto sem formatação da página de manual, pode usar o comando

man -P cat <thepage>

A -Popção define o pager em outro unix e catignorará as informações de formatação, fornecendo uma saída de texto sem formatação. No entanto, isso não parece funcionar no macOS, portanto, a saída precisa de uma col -betapa manual no pipeline:

man ls | col -b | grep BUGS
Scot
fonte
2
Graças à Scot! Redirecionar para um arquivo e abrir em um editor de texto deveria ter sido a primeira coisa que tentei. Usando essas informações e as informações de unix.stackexchange.com/a/15866 (ou seja man ls | col -b | grep "BUGS"), consegui o que queria.
22818 Jonathan Merklin
7
Santo Deus, o negrito é a antiga era TTY e máquina de escrever, digite uma letra e backspace e digite a letra novamente, sabendo que eles não se alinham perfeitamente e depositam mais tinta. Tem que haver um nroffcomando para traduzir isso, se você precisar grep - você se importaria se eu expandisse isso com como passar o comando correto para groffvia man?
bmike
@Kroltan +10 e +10 para escocês também. Isso é muito mais elegante do que como eu não estava pensando em esfolar esse gato em particular.
bmike
@ Kroltan Hmmm - para mim, man -P cat ls | grep BUGSfunciona de forma idêntica man ls | grep BUGS, ambos não retornam nada.
26418 Scot
1
Para sistemas manuais que empregam GNU roff, existem de fato opções para grottyimpedir que ele emita sequências de controle TTY-37 ou ECMA48.
JdeBP 26/06