Qual é a fonte de ajuda?

8

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

Às vezes, acho que sua informação parece expandir isso por --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 achei que help extraiu 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'
    
por Tim 11.07.2014 / 15:33

4 respostas

19

help é um bash embutido e fornece apenas os detalhes de outros bash builtins do buildtime.

A origem para help é gerada em tempo de compilação a partir dos arquivos def nos diretórios internos da árvore de código bash. Se você olhar para o código-fonte de ajuda e cd você notará que as informações são parte de $SHORT_DOC . help usa uma matriz chamada shell_builtins para acessar as informações.

    
por 11.07.2014 / 15:50
12

Sometimes I find its information seems to expand that by --help

help cd e cd --help sã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, eles são recursos de, por exemplo,% código%. 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 exporão um caminho executável se você solicitar bash . As informações na página do manual ou de which [command] são para o executável; as informações de [command] --help são para o built-in, mas esperamos que sejam mais ou menos as mesmas. Se você procurar por uma página man para um comando que é apenas um built-in, você provavelmente irá obter uma página para o shell listando todos os seus comandos internos.

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

Se houver versões integradas e autônomas de um comando disponível e você quiser saber qual delas é usado quando invocá-lo, você pode usar --help , outro 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 autônomo type , o echo que o seu shell invoca é interno.

    
por 11.07.2014 / 15:54
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.

A ajuda é um comando BUILTIN (significa, bash internal command) para obter informações de outros comandos internos. Já que este script de terceira parte não é um comando interno do bash. Se você executar bash , chame o help de um uso strace que você obterá:

# 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)---

Significa que essa informação é gerada no momento da criação dentro do binário bash.

    
por 11.07.2014 / 15:53
2

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

Editar

Eu interpretei mal parte da sua pergunta. Eu não estou familiarizado com nenhum dos funcionamentos internos do comando "help" em si.

    
por 11.07.2014 / 15:44

Tags