Todos os shell shell compartilham a mesma página de manual:
BUILTIN(1) BSD General Commands Manual BUILTIN(1)
NAME
builtin, !
etc.
Depois, há um pequeno texto descrevendo o que são os shellins integrados e, em seguida, uma lista que se parece com isso:
Command External csh(1) sh(1)
! No No Yes
% No Yes No
Mas se conseguirmos, man grep
temos seções como
- Insetos
- História
- Veja também
- Padrões
- Descrição
etc.
Os shell shell não têm sua própria história, descrição e argumentos como -A
ou -r
? Por que isso não é fornecido nas páginas de manual e como eu aprenderia a usá-las de maneira correta e eficiente?
command-line
osx
freebsd
man
Mostrar nome
fonte
fonte
Respostas:
Porque os componentes internos fazem parte do shell. Quaisquer bugs ou histórico que eles tiverem são bugs e histórico do próprio shell. Eles não são comandos independentes e não existem fora do shell em que estão integrados.
O equivalente,
bash
pelo menos, é ohelp
comando. Por exemplo:Todos os bash builtins têm
help
páginas. Mesmohelp
ele mesmo :Inspirado no
sed
script de @ mikeserv , aqui está uma pequena função que imprimirá a seção relevante de uma página de manual usando Perl. Adicione esta linha ao arquivo de inicialização do seu shell (~/.bashrc
para bash):Em seguida, você o executa fornecendo uma página de manual e o nome de uma seção:
fonte
SHELL BUILTIN COMMANDS
seção dabash
página de manual. Suas "páginas de manual" sãohelp builtin_name
.man git commit
a página de manual é exibidagit-commit
. Algo comoman bash if
seria maravilhoso .Embora seja verdade que alguns componentes internos do shell podem ter pouca exibição em um manual completo - especialmente para aqueles
bash
componentes específicos que você provavelmente só usa em um sistema GNU (o pessoal do GNU, por via de regra, não acreditaman
e preferem suas própriasinfo
páginas) - a grande maioria dos utilitários POSIX - embutidos no shell ou outros - estão muito bem representados no Guia do Programador do POSIX.Aqui está um trecho da parte inferior do meu
man sh
(que provavelmente tem 20 páginas ou mais ...)Todos esses estão lá, e outros não mencionados, como
set
,read
,break
... bem, eu não preciso nomeá-los todos. Mas observe o(1P)
canto inferior direito - denota a série de manuais da categoria 1 do POSIX - são essas asman
páginas das quais estou falando.Pode ser que você só precise instalar um pacote? Isso parece promissor para um sistema Debian. Embora
help
seja útil, se você puder encontrá-lo, definitivamente deverá obter essaPOSIX Programmer's Guide
série. Pode ser extremamente útil. E suas páginas constituintes são muito detalhadas.Além disso, os buildins do shell quase sempre são listados em uma seção específica do manual do shell específico.
zsh
, por exemplo, tem umaman
página inteira separada para isso (acho que totaliza 8 ou 9zsh
páginas individuais ), incluindo ozshall
que é enorme.Você pode, é
grep
man
claro:... o que é bem parecido com o que costumava fazer ao pesquisar uma
man
página de shell . Mashelp
é muito bombash
na maioria dos casos.Na verdade, eu tenho trabalhado em um
sed
script para lidar com esse tipo de coisa recentemente. Foi assim que peguei a seção na foto acima. Ainda é mais longo do que eu gosto, mas está melhorando - e pode ser bastante útil. Em sua iteração atual, ele extrai de maneira bastante confiável uma seção de texto sensível ao contexto, correspondente a uma seção ou cabeçalho de subseção com base nos [a] padrões [s] dados na linha de comando. Ele colore sua saída e imprima em stdout.Ele funciona avaliando os níveis de recuo. Linhas de entrada não em branco geralmente são ignoradas, mas quando encontra uma linha em branco, começa a prestar atenção. Ele reúne linhas a partir daí até verificar que a sequência atual definitivamente recua ainda mais do que sua primeira linha antes que outra linha em branco ocorra, ou então deixa cair o segmento e aguarda o próximo espaço em branco. Se o teste for bem-sucedido, ele tenta combinar a linha de chumbo com seus argumentos da linha de comando.
Isto significa que um jogo padrão irá corresponder:
..e..
..mas não..
..ou..
Se houver uma correspondência, ela começa a imprimir. Ele removerá os espaços em branco principais da linha correspondente de todas as linhas impressas - portanto, não importa o nível de indentação encontrado, a linha impressa como se estivesse no topo. Ele continuará sendo impresso até encontrar outra linha em um nível igual ou inferior ao recuo que sua linha correspondente - para que seções inteiras sejam agarradas apenas com uma correspondência de cabeçalho, incluindo todas / todas as subseções, parágrafos que possam conter.
Então, basicamente, se você solicitar que ele corresponda a um padrão, ele o fará apenas contra um cabeçalho de assunto de algum tipo e colorirá e imprimirá todo o texto encontrado na seção encabeçada por sua correspondência. Nada é salvo assim, exceto o recuo da primeira linha - e, portanto, pode ser muito rápido e lidar com
\n
entradas separadas por linha de ew de praticamente qualquer tamanho.Levei um tempo para descobrir como recursar em subtítulos como o seguinte:
Mas eu resolvi isso eventualmente.
Eu tive que refazer a coisa toda por uma questão de simplicidade, no entanto. Embora antes eu tivesse vários pequenos loops fazendo basicamente as mesmas coisas de maneiras ligeiramente diferentes para se ajustarem ao seu contexto, variando seus meios de recursão, eu consegui desduplicar a maioria do código. Agora existem dois loops - um imprime e um verifica recuo. Ambos dependem do mesmo teste - o loop de impressão inicia quando o teste passa e o loop de recuo assume o controle quando falha ou inicia em uma linha em branco.
Todo o processo é muito rápido, porque na maioria das vezes
/./d
elimina qualquer linha que não esteja em branco e passa para a próxima - resulta mesmo dezshall
preencher a tela instantaneamente. Isso não mudou.De qualquer forma, é muito útil até agora, no entanto. Por exemplo, a
read
coisa acima pode ser feita como:... e fica com o bloco inteiro. Pode levar qualquer padrão ou qualquer outra coisa, ou vários argumentos, embora o primeiro seja sempre a
man
página na qual ele deve pesquisar. Aqui está uma imagem de alguns de seus resultados depois que eu fiz:... os dois blocos são retornados inteiros. Costumo usá-lo como:
... para o qual é bastante útil. Além disso, obter o
SYNOPS[ES]
torna realmente útil:Aqui está, se você quiser dar uma guinada - não vou te culpar se não o fizer.
Resumidamente, o fluxo de trabalho é:
\n
caractere ewline será excluída da saída.\n
Os caracteres ewline nunca ocorrem no espaço do padrão de entrada. Eles só podem ser obtidos como resultado de uma edição.:print
e:indent
são loops fechados mutuamente dependentes e são a única maneira de obter uma linha de\n
ew.:print
O ciclo de loop do começa se os caracteres\n
iniciais de uma linha são uma série de espaços em branco seguidos por um caractere de linha de ew.:indent
O ciclo começa em linhas em branco - ou em:print
linhas de ciclo que falham#test
- mas:indent
remove todas as principais\n
seqüências em branco + linha de linha de saída de sua saída.:print
iniciado, ele continuará puxando as linhas de entrada, eliminando os espaços em branco até a quantidade encontrada na primeira linha do seu ciclo, convertendo escapamentos de overstrike e understrike em backspace em escapes terminais coloridos e imprimindo os resultados até#test
falhar.:indent
início, ele primeiro verifica oh
espaço antigo quanto a qualquer possível continuação de recuo (como uma subseção) e continua a receber entradas desde que#test
falhe e qualquer linha após a primeira continua a corresponder[-
. Quando uma linha após a primeira não corresponde a esse padrão, ela é excluída - e, posteriormente, todas as linhas seguintes são seguidas até a próxima linha em branco.#match
e#test
colmatar os dois loops fechados.#test
passa quando a série principal de espaços em branco é menor que a série seguida pela última\n
linha de ew em uma sequência de linhas.#match
\n
precede as linhas de linha principais necessárias para iniciar um:print
ciclo para qualquer uma das:indent
seqüências de saída que levam uma correspondência a qualquer argumento da linha de comando. Aquelas seqüências que não são renderizadas em branco - e a linha em branco resultante é passada de volta para:indent
.fonte
manperl(){ man $1 | perl -00ne "print if /^\s*$2\b/"; }
e, em seguida,manperl sh SYNOPSIS
oumanperl sh read
:)sed 'H;$!d;g;s/\(\(\n *\)match\([^\n]*\)\2 \)\{1,\}\)*.\{,1\}/\1/g'
... provavelmente isso funciona ... mas isso requer engolir o arquivo e analisar tudo de uma vez. Isso funciona em um fluxo - ele pode lidar com entradas de qualquer tamanho, desde que as linhas não sejam astronomicamente longas. Ele é impresso à medida que funciona - e analisa todosman
os\b
escapes do ackslash para inicializar. Masman
é apenas uma única aplicação para ele - Eu apliquei muito do que a outros problemas, bem ...\n\n
vez de,\n
mas ainda pode lidar com qualquer tamanho de entrada e imprime à medida que funciona. Veja "modo de parágrafo" aqui: perldoc.perl.org/perlrun.htmlsed
que pode ser feito como:'/./{H;$!d' -e '};x;now work the paragraph...'
. Eu também faço isso frequentemente. Mas originalmente escrevi a primeira parte para assistir a um registro ao vivo por um período ilimitado de tempo, e mesmo esse comportamento era duvidoso - o buffer pode explodir sob certas condições. Isso era apenas metade desse tamanho -man
tornava mais difícil. Eu olheiman -H
depois de obter aman
sinop acima, e acho que pode ser mais fácil trabalhar com o HTML gerado por máquina que o groff pode imprimir nos sistemas GNU. Já estou meio que cotovelo jámansed cmd DESCRIPTION
recebe a seção DESCRIPTION - e todas as incluídas. Uma pesquisa correspondente é impressa inteira e como se seu nível de recuo fosse o primeiro. Ele até pula falsos positivos ignorando parágrafos que correspondem, mas não recuam ainda mais. Ele combina seus argumentos através das escapes do backspace colorido e não os manipula até que esteja definitivamente pronto para imprimir uma linha. Tudo isso é muito difícil para mim, com muito mais dados do que uma única linha de cada vez.Cada shell possui seu próprio conjunto de componentes. Embora existam pontos em comum, cada um deles tem suas próprias peculiaridades que precisam ser documentadas.
Em sistemas como Linux e FreeBSD (e OSX, que herda do FreeBSD) em que cada shell é fornecido como um pacote separado, não há página de manual para os componentes internos; em vez disso, cada built-in é documentado na página do manual do shell. Portanto, leia a página do manual do bash para obter a documentação do built-in do bash
kill
, leia a página do manual do dash para a documentação do built-in do dashkill
, etc. Há também uma página do manual para okill
utilitário independente.Consulte Posso obter páginas de manual individuais para os comandos bash builtin? para uma
man
função que mostra a documentação interna do bash em vez da página de manual, se o argumento for o nome de um builtin.Existem variantes unix que fornecem páginas de manual para os shell shell - de fato, a maioria das variantes comerciais fornece. Isso é possível porque o sistema vem com uma única concha ou um conjunto de conchas conhecidas. A página de manual discute as diferenças entre os shells. Por exemplo, a
fg(1)
página de manual no Solaris 10 possui seções parash
,ksh
ecsh
. Afg(1)
página de manual no AIX 7.1 faz referência ao "shell Korn" e "shell POSIX", mas os discute juntos (eles suportam exatamente os mesmos recursos parafg
). Afg(1)
página do manual no Tru64 5.0 discute o ksh embutido e refere os usuários do csh àcsh(1)
página do manual. SCOaparentemente vem com uma única concha. Você pode instalar outros shells como pacotes complementares nesses sistemas operacionais; se você usar um shell personalizado, lembre-se de que as páginas de manual dos componentes internos não serão relevantes ao usar um shell não padrão.fonte