Quelle est la source d'aide?

8

help affiche des informations sur les commandes intégrées. Quelle est la source d'aide? Maintient-il une base de données pour les commandes intégrées ou lit-il certains fichiers de chaque commande intégrée (semblable à la page de manuel de chaque utilitaire)?

Parfois, je trouve que ses informations semblent --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.

Je pensais helpextraire la partie d'aide de l'exécutable, mais pour un script python pdf-merge.py , ce n'est pas

$ 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
la source
3
Juste pour clarifier, cdn'a pas d' --helpoption. Ce que vous voyez est le message d'utilisation de base que vous obtenez lorsque vous essayez d'utiliser un indicateur d'option non valide.
terdon
Voir aussi la mancommande, et dans les systèmes qui la prennent en charge, la infocommande.
keshlam

Réponses:

19

help est une commande bash intégrée et ne vous fournit que les détails des autres commandes bash de buildtime.

La source de helpest générée au moment de la compilation à partir des deffichiers des répertoires intégrés de l'arborescence des sources bash. Si vous regardez le code source de l'aide et cdvous remarquerez que les informations font partie de $SHORT_DOC. helputilise un tableau appelé shell_builtinspour accéder aux informations.

Ulrich Dangel
la source
1
Preuve supplémentaire:strings /bin/bash | grep 'Change the current directory to DIR'
200_success
12

Parfois, je trouve que ses informations semblent étendre cela par --help

help cdet cd --helpsont fondamentalement différents. helpest une commande intégrée dans la coque, et il fournit des informations sur d' autres commandes qui sont intégrés dans la coque , ce qui signifie, ils ne sont pas executables de leur propre, ils sont caractéristiques, par exemple, bash. Cela peut devenir un peu déroutant car certaines commandes intégrées ont également des versions exécutables autonomes. Dans ce cas, ils ont généralement leur propre page de manuel et exposeront un chemin exécutable si vous le demandez which [command]. Les informations de la page de manuel ou de [command] --helpsont destinées à l'exécutable; les informations help [command]sont pour le intégré, mais j'espère qu'elles sont plus ou moins les mêmes. Si vous recherchez une page de manuel pour une commande qui n'est qu'une fonction intégrée, vous obtiendrez probablement une page pour le shell répertoriant toutes ses commandes intégrées.

--help(y compris la forme courte -h) n'est qu'une étiquette conventionnelle pour une option de ligne de commande pour un exécutable. De nombreux outils CLI, mais pas tous, l'implémentent, mais ils ne sont pas liés et les informations fournies dépendent entièrement de l'implémentation. Si vous appelez --helpsur un shell intégré, vous obtenez probablement une "option non valide" et un bref message "d'utilisation". Si vous l'invoquez sur une version autonome qui ne l'implémente pas, vous pouvez également obtenir une «option non valide», mais ce qui se produit à nouveau dépend de l'application.

S'il existe des versions intégrées et autonomes d'une commande et que vous souhaitez savoir laquelle est utilisée lorsque vous l'invoquez, vous pouvez utiliser typeun autre shell intégré.

> 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

Ici, nous pouvons voir que bien qu'il existe un exécutable autonome echo, le echoshell que vous invoquez est intégré.

boucle d'or
la source
1
Pas besoin de taper typedeux fois: type -a echorenvoie tous les appels à echovotre portée (comme défini par $ PATH), y compris les fonctions intégrées, les fonctions shell et les alias. Voir help typepour référence.
Tatjana Heuser
8

Vous avez déjà répondu à votre propre question:

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.

L'aide est une commande BUILTIN (signifie, commande interne bash) pour obtenir des informations sur d'autres commandes intégrées. Puisque ce script de troisième partie n'est pas une commande intégrée de bash. Si vous exécutez bash, appelez le builtin helpet stracevous obtiendrez:

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

Cela signifie à peu près que ces informations sont générées au moment de la construction à l'intérieur du binaire bash.


la source
Ils ne sont pas codés en dur mais sont générés au moment de la construction
Ulrich Dangel
Merci. (1) Qu'entendez-vous par "appeler l'aide intégrée une strace d'utilisation"? (2) les informations d'utilisation sont codées en dur dans l'exécutable de la commande intégrée cd?
Tim
@UlrichDangel - Merci pour la correction. Codé en dur se rapporte à quelque chose de fixe sur le code source, et non à l'intérieur du binaire pendant la compilation. Mon mauvais;) @Tim. straceest un outil pour voir ce qu'une commande déterminée fait pendant son exécution (bibliothèques, appels système, fichiers ouverts, etc.). La méthode writemontre que les informations d'aide proviennent de l'intérieur du binaire (bash) lors de l'utilisation de la commande intégrée help, et non de l'ouverture d'un fichier (comme une page de manuel).
2

Je pense que --help fait partie de l'exécutable, il doit y être implémenté. C'est pourquoi vous voyez différentes versions de --help, parfois le raccourci -h est autorisé, d'autres c'est "l'aide" non préfixée…

Éditer

J'ai mal lu une partie de votre question. Je ne connais pas le fonctionnement interne de la commande "help" elle-même.

Jon Surrell
la source
Comment la commande helptrouve-t-elle les informations d'une autre commande?
Tim