¿Cuál es la fuente de ayuda?

8

help Muestra información sobre los comandos incorporados. ¿Cuál es la fuente de ayuda? ¿Mantiene una base de datos para los comandos incorporados o lee algunos archivos de cada comando incorporado (similar a la página de manual de cada utilidad)?

A veces encuentro que su información parece expandir eso al --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.

Pensé helpextraer la parte de ayuda del ejecutable, pero para un script de python pdf-merge.py , no es

$ 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
fuente
3
Solo para aclarar, cdno tiene una --helpopción. Lo que está viendo es el mensaje de uso básico que recibe cuando intenta utilizar un indicador de opción no válido.
terdon
Consulte también el mancomando, y en los sistemas que lo admiten, el infocomando.
keshlam

Respuestas:

19

help es un bash builtin y solo le proporciona los detalles de otros bash builtins desde el momento de la compilación.

El origen de helpse genera en tiempo de compilación a partir de los defarchivos en los directorios incorporados del árbol de origen de bash. Si mira el código fuente de ayuda y cdnotará que la información es parte de $SHORT_DOC. helpusa una matriz llamada shell_builtinspara acceder a la información.

Ulrich Dangel
fuente
1
Evidencia adicional:strings /bin/bash | grep 'Change the current directory to DIR'
200_success
12

A veces encuentro que su información parece expandirse al --help

help cdy cd --helpson fundamentalmente diferentes helpes un comando integrado en la carcasa, y proporciona información acerca de otros comandos que se construyen en la cáscara , lo que significa, que no son ejecutables de los suyos, que son características de, por ejemplo, bash. Esto puede ser un poco confuso ya que algunos comandos incorporados también tienen versiones ejecutables independientes. En este caso, generalmente tienen su propia página de manual y expondrán una ruta ejecutable si lo solicita which [command]. La información en la página de manual, o de [command] --helpes para el ejecutable; La información de help [command]es para el incorporado, pero con suerte son más o menos lo mismo. Si busca una página de manual para un comando que es solo integrado, probablemente obtendrá una página para el shell que enumera todos sus comandos integrados.

--help(incluida la forma abreviada -h) es solo una etiqueta convencional para una opción de línea de comando para un ejecutable. Muchas, pero no todas, las herramientas CLI implementan esto, pero no están vinculadas y la información proporcionada depende completamente de la implementación. Si invoca --helpen un shell integrado, es probable que obtenga una "opción no válida" y un breve mensaje de "uso". Si lo invoca de forma independiente y no lo implementa, también puede obtener una "opción no válida", pero lo que sucede nuevamente depende de la aplicación.

Si hay versiones integradas y autónomas de un comando disponibles y desea saber cuál se usa cuando lo invoca, puede usar typeotro shell incorporado.

> 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

Aquí podemos ver que, aunque hay un ejecutable independiente echo, el echoshell que invoca está integrado.

encerrada dorada
fuente
1
No es necesario escribir typedos veces: type -a echodevuelve todas las llamadas a echosu alcance (según lo definido por $ PATH), incluidas las funciones incorporadas, las funciones de shell y los alias. Ver help typepara referencia.
Tatjana Heuser
8

Ya respondiste tu propia pregunta:

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.

La ayuda es un comando BUILTIN (significa comando interno bash) para obtener información de otros comandos incorporados. Dado que este script de tercera parte no es un comando incorporado de bash. Si corre bash, llame al helpuso interno straceque obtendrá:

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

Prácticamente significa que esta información se genera en tiempo de compilación dentro del binario bash.


fuente
No están codificados, pero se generan en el momento de la compilación
Ulrich Dangel
Gracias. (1) ¿Qué quiere decir con "llamar a la ayuda incorporada y usar strace"? (2) la información de uso está codificada en el ejecutable del comando incorporado cd?
Tim
@UlrichDangel - Gracias por la corrección. El código fijo se relaciona con algo fijado en el código fuente y no dentro del binario durante el tiempo de compilación. Mi mal;) @Tim. stracees una herramienta para ver qué hace un comando determinado mientras está en ejecución (bibliotecas, llamadas al sistema, archivos abiertos, etc.). El método writemuestra que la información de ayuda proviene del interior del binario (bash) mientras se usa el comando de ayuda incorporado, y no de la apertura de un archivo (como una página de manual).
2

Creo que --help es parte del ejecutable, debe implementarse allí. Es por eso que ves diferentes versiones de --help, a veces --h se permite la taquigrafía, otras es la "ayuda" sin prefijo ...

Editar

Leí mal parte de tu pregunta. No estoy familiarizado con ninguno de los mecanismos internos del comando de "ayuda".

Jon Surrell
fuente
¿Cómo encuentra el comando helpla información de otro comando?
Tim