Qual é a fonte da ajuda?

8

help exibe informações sobre comandos internos. Qual é a fonte da ajuda? Ele mantém um banco de dados para comandos internos ou lê alguns arquivos de cada comando interno (semelhante à página de manual de cada utilitário)?

Às vezes, acho que suas informações parecem expandir isso --help

$ cd --help
bash: cd: --: invalid option
cd: usage: cd [-L|[-P [-e]]] [dir]

$ help cd
cd: cd [-L|[-P [-e]]] [dir]
    Change the shell working directory.

    Change the current directory to DIR.  The default DIR is the value of the
    HOME shell variable.

    The variable CDPATH defines the search path for the directory containing
    DIR.  Alternative directory names in CDPATH are separated by a colon (:).
    A null directory name is the same as the current directory.  If DIR begins
    with a slash (/), then CDPATH is not used.

    If the directory is not found, and the shell option `cdable_vars' is set,
    the word is assumed to be  a variable name.  If that variable has a value,
    its value is used for DIR.

    Options:
        -L  force symbolic links to be followed
        -P  use the physical directory structure without following symbolic
        links
        -e  if the -P option is supplied, and the current working directory
        cannot be determined successfully, exit with a non-zero status

    The default is to follow symbolic links, as if `-L' were specified.

    Exit Status:
    Returns 0 if the directory is changed, and if $PWD is set successfully when
    -P is used; non-zero otherwise.

Eu pensei em helpextrair a parte de ajuda do executável, mas para um script python pdf-merge.py , não é

$ help ./pdf-merge.py
bash: help: no help topics match `./pdf-merge.py'.  Try `help help' or `man -k ./pdf-merge.py' or `info ./pdf-merge.py'.

$ ./pdf-merge.py --help
usage: pdf-merge.py [-h] [-v] [--ask] [--output OUTPUT] [--title TITLE]
                    [--author AUTHOR] [--keyword KEYWORD] [--pdftk PDFTK]
                    [--gs GS] [--pdfmarks PDFMARKS] [--unicode]
                    PDF [PDF ...]

Merge PDFs preserving bookmarks. Thanks to Larry Cai for suggesting that
Unicode be supported and for discussion about the `--pdfmarks` option.

positional arguments:
  PDF                  an input PDF to merge

optional arguments:
  -h, --help           show this help message and exit
  -v, --version        show program's version number and exit
  --ask                pause for manual pdfmark tweaking
  --output OUTPUT      name of the output PDF
  --title TITLE        title of output PDF
  --author AUTHOR      author of output PDF
  --keyword KEYWORD    keywords for the output PDF
  --pdftk PDFTK        path to the pdftk executable
  --gs GS              path to the gs (Ghostscript) executable
  --pdfmarks PDFMARKS  path to pdfmarks file. If not given, a temporary file
                       is used. If given and the file is missing, execution
                       will stop after the file is created (before the
                       Ghostscript run). If given and the file exists, no
                       attempt will be make to use pdftk to generate the mark
                       file (I assume your input file is what you want).
  --unicode            instead of merging PDFs, convert PDF-formatted unicode
                       strings. For example `--unicode '<FEFF03B103B203B3>'
                       \u03b1\u03b2\u03b3`
Tim
fonte
3
Só para esclarecer, cdnão tem uma --helpopção. O que você vê é a mensagem de uso básico que você recebe ao tentar usar um sinalizador de opção inválido.
terdon
Veja também o mancomando e nos sistemas que o suportam info.
Kevlam

Respostas:

19

help é um bash builtin e fornece apenas os detalhes de outros bash builtins desde o momento da construção.

A origem de helpé gerada em tempo de compilação a partir dos defarquivos nos diretórios internos da árvore de origem do bash. Se você olhar o código fonte da ajuda e cdperceberá que as informações fazem parte $SHORT_DOC. helpusa uma matriz chamada shell_builtinspara acessar as informações.

Ulrich Dangel
fonte
1
Mais evidências:strings /bin/bash | grep 'Change the current directory to DIR'
200_success
12

Às vezes, acho que suas informações parecem expandir isso por --help

help cde cd --helpsão fundamentalmente diferentes. helpé um comando embutido no shell e fornece informações sobre outros comandos que são embutidos no shell , ou seja, eles não são executáveis ​​por si mesmos, são recursos de, por exemplo bash,. Isso pode ficar um pouco confuso, pois alguns comandos internos também possuem versões executáveis ​​independentes. Nesse caso, eles geralmente têm sua própria página de manual e expõem um caminho executável, se você perguntar which [command]. As informações na página do manual ou from [command] --helpsão para o executável; as informações de help [command]são para o built-in, mas espero que sejam mais ou menos iguais. Se você procurar uma página de manual para um comando que seja apenas um interno, provavelmente obterá uma página para o shell listando todos os seus comandos internos.

--help(incluindo o formato abreviado -h) é apenas um rótulo convencional para uma opção de linha de comando para um executável. Muitas, mas não todas, as ferramentas CLI implementam isso, mas elas não estão vinculadas e as informações fornecidas dependem completamente da implementação. Se você invocar --helpum shell interno, provavelmente receberá "opção inválida" e uma breve mensagem de "uso". Se você invocá-lo de forma independente que não o implementa, também poderá receber uma "opção inválida", mas exatamente o que acontece novamente depende do aplicativo.

Se houver versões internas e independentes de um comando disponíveis e você quiser saber qual é usado quando o chama, você pode usar typeoutro shell interno.

> help type
type: type [-afptP] name [name ...]
Display information about command type.

For each NAME, indicate how it would be interpreted if used as a
command name.
[...]

> which echo
/bin/echo

> type echo
echo is a shell builtin

Aqui podemos ver que, embora exista um executável independente echo, o echoseu shell chama é um built-in.

Cachinhos Dourados
fonte
1
Não é necessário digitar typeduas vezes: type -a echoretorna todas as chamadas ao echoseu alcance (conforme definido por $ PATH), incluindo builtins, funções de shell e aliases. Veja help typepara referência.
31416 Tatjana Heuser
8

Você já respondeu sua própria pergunta:

nicolas@host:~$ help help
help: help [-s] [pattern ...]
    Display helpful information about builtin commands.  If PATTERN is
    specified, gives detailed help on all commands matching PATTERN,
    otherwise a list of the builtins is printed.  The -s option
    restricts the output for each builtin command matching PATTERN to
    a short usage synopsis.

Help é um comando BUILTIN (significa, bash comando interno) para obter informações de outros comandos internos. Como esse script da terceira parte não é um comando interno do bash. Se você executar bash, chame o builtin de helpuso que stracevocê receberá:

# strace bash -i -c "help cd"
---snip(long output)---
write(1, "cd: cd [-L|-P] [dir]\n"..., 21cd: cd [-L|-P] [dir]
) = 21
open("/usr/share/locale/locale.alias", O_RDONLY) = 3
fstat(3, {st_mode=S_IFREG|0644, st_size=2570, ...}) = 0
mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f38b765c000
read(3, "# Locale name alias data base.\n# "..., 4096) = 2570
read(3, ""..., 4096)                    = 0
close(3)                                = 0
munmap(0x7f38b765c000, 4096)            = 0
open("/usr/share/locale/pt_BR/LC_MESSAGES/bash.mo", O_RDONLY) = -1 ENOENT (No such file or directory)
open("/usr/share/locale/pt/LC_MESSAGES/bash.mo", O_RDONLY) = -1 ENOENT (No such file or directory)
open("/usr/share/locale/en/LC_MESSAGES/bash.mo", O_RDONLY) = -1 ENOENT (No such file or directory)
write(1, "    Change the current directory "..., 710    Change the current directory to DIR.  The variable $HOME is the
    default DIR.  The variable CDPATH defines the search path for
    the directory containing DIR.  Alternative directory names in CDPATH
    are separated by a colon (:).  A null directory name is the same as
    the current directory, i.e. `.'.  If DIR begins with a slash (/),
    then CDPATH is not used.  If the directory is not found, and the
    shell option `cdable_vars' is set, then try the word as a variable
    name.  If that variable has a value, then cd to the value of that
    variable.  The -P option says to use the physical directory structure
    instead of following symbolic links; the -L option forces symbolic links
) = 710
write(1, "    to be followed.\n"..., 20    to be followed.
) = 20
---snip(long output)---

Praticamente significa que essas informações são geradas no momento da construção dentro do binário do bash.


fonte
Eles não são codificado, mas são geradas em tempo de compilação
Ulrich Dangel
obrigado. (1) O que você quer dizer com "chamar o builtin ajuda a usar strace"? (2) as informações de uso são codificadas no executável do comando interno cd?
Tim
@UlrichDangel - Obrigado pela correção. Codificado está relacionado a algo corrigido no código fonte, e não dentro do binário durante o tempo de compilação. Meu mal;) @ Tim. straceé uma ferramenta para ver o que um determinado comando está fazendo durante a execução (bibliotecas, chamadas do sistema, arquivos abertos etc.). O método writemostra que as informações de ajuda vêm de dentro do binário (bash) enquanto você usa o comando help builtin, e não da abertura de um arquivo (como uma página de manual).
2

Eu acredito que --help faz parte do executável, tem que ser implementado lá. É por isso que você vê versões diferentes de --help, às vezes -h abreviação é permitida, outras é a "ajuda" não prefixada…

Editar

Eu li mal parte de sua pergunta. Não estou familiarizado com nenhum dos trabalhos internos do próprio comando "ajuda".

Jon Surrell
fonte
Como o comando helpencontra as informações de outro comando?
Tim