Was ist die Quelle der Hilfe?

8

help Zeigt Informationen zu integrierten Befehlen an. Was ist die Quelle der Hilfe? Verwaltet es eine Datenbank für integrierte Befehle oder liest es einige Dateien der einzelnen integrierten Befehle (ähnlich der Manpage der einzelnen Dienstprogramme)?

Manchmal finde ich, dass seine Informationen das zu erweitern scheinen --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.

Ich dachte, helpextrahieren Sie den Hilfeteil der ausführbaren Datei, aber für ein Python-Skript pdf-merge.py ist dies nicht der Fall

$ 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
quelle
3
Nur zur Klarstellung, cdhat keine --helpOption. Was Sie sehen, ist die grundlegende Verwendungsmeldung, die Sie erhalten, wenn Sie versuchen, ein ungültiges Optionsflag zu verwenden.
Terdon
Siehe auch den manBefehl und in Systemen, die ihn unterstützen, den infoBefehl.
Keshlam

Antworten:

19

help ist eine eingebaute Bash und bietet Ihnen nur die Details anderer eingebauter Bashs aus der Buildtime.

Die Quelle für helpwird zur Kompilierungszeit aus den defDateien in den integrierten Verzeichnissen des Bash-Quellbaums generiert . Wenn man sich die aussieht Quellcode Hilfe und cdSie werden feststellen , dass der Informationsteil ist $SHORT_DOC. helpverwendet ein Array, das aufgerufen wird, shell_builtinsum auf die Informationen zuzugreifen.

Ulrich Dangel
quelle
1
Weitere Beweise:strings /bin/bash | grep 'Change the current directory to DIR'
200_erfolg
12

Manchmal finde ich, dass seine Informationen das durch --help zu erweitern scheinen

help cdund cd --helpsind grundlegend anders. helpist ein in die Shell integrierter Befehl, der Informationen zu anderen in die Shell integrierten Befehlen enthält. Dies bedeutet, dass es sich nicht um eigene ausführbare Dateien handelt, sondern um Funktionen von z bash. Dies kann etwas verwirrend sein, da einige integrierte Befehle auch eigenständige ausführbare Versionen haben. In diesem Fall haben sie normalerweise eine eigene Handbuchseite und legen auf Anfrage einen ausführbaren Pfad offen which [command]. Die Informationen in der Manpage oder von [command] --helpbeziehen sich auf die ausführbare Datei. Die Informationen von help [command]sind für die eingebauten, aber hoffentlich sind sie mehr oder weniger gleich. Wenn Sie nach einer Manpage für einen Befehl suchen, der nur integriert ist, erhalten Sie wahrscheinlich eine Seite für die Shell, auf der alle integrierten Befehle aufgelistet sind.

--help(einschließlich der Kurzform -h) ist nur eine herkömmliche Bezeichnung für eine Befehlszeilenoption für eine ausführbare Datei. Viele, aber nicht alle CLI-Tools implementieren dies, sind jedoch nicht daran gebunden, und die bereitgestellten Informationen hängen vollständig von der Implementierung ab. Wenn Sie --helpeine integrierte Shell aufrufen , erhalten Sie wahrscheinlich die Meldung "Ungültige Option" und eine kurze Meldung "Verwendung". Wenn Sie es auf einem Standalone-Gerät aufrufen, das es nicht implementiert, erhalten Sie möglicherweise auch eine "ungültige Option". Was genau jedoch erneut passiert, hängt von der Anwendung ab.

Wenn sowohl integrierte als auch eigenständige Versionen eines Befehls verfügbar sind und Sie wissen möchten, welche beim Aufrufen verwendet wird, können Sie eine typeandere integrierte Shell verwenden.

> 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

Hier können wir sehen, dass, obwohl es eine eigenständige ausführbare Datei gibt echo, die von echoIhrer Shell aufgerufene Datei eine integrierte ist.

Goldlöckchen
quelle
1
Keine typezweimalige Eingabe erforderlich: Gibt type -a echoalle Aufrufe in echoIhre Reichweite zurück (wie durch $ PATH definiert), einschließlich eingebauter Funktionen, Shell-Funktionen und Aliase. Siehe help typeals Referenz.
Tatjana Heuser
8

Sie haben bereits Ihre eigene Frage beantwortet:

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.

Hilfe ist ein BUILTIN-Befehl (bedeutet, bash interner Befehl), um Informationen über andere eingebaute Befehle abzurufen. Seit diesem dritten Teil ist das Skript kein eingebauter Befehl von bash. Wenn Sie ausführen bash, rufen Sie das eingebaute System auf help, das straceSie erhalten:

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

Ziemlich genau bedeutet, dass diese Informationen zur Erstellungszeit innerhalb der Bash-Binärdatei generiert werden.


quelle
Sie sind nicht fest codiert, sondern werden zur Erstellungszeit generiert
Ulrich Dangel
Vielen Dank. (1) Was meinst du mit "nenne die eingebaute Hilfe eine Gebrauchsgurte"? (2) sind die Nutzungsinformationen in der ausführbaren Datei des eingebauten Befehls fest codiert cd?
Tim
@UlrichDangel - Danke für die Korrektur. Hardcodiert bezieht sich auf etwas, das im Quellcode festgelegt ist und sich während der Kompilierungszeit nicht in der Binärdatei befindet. Mein schlechtes;) @Tim. straceist ein Tool, mit dem Sie sehen können, was ein bestimmter Befehl während der Ausführung tut (Bibliotheken, Systemaufrufe, geöffnete Dateien usw.). Die Methode writezeigt, dass die Hilfeinformationen aus der Binärdatei (bash) stammen, während der eingebaute Befehl help verwendet wird, und nicht aus dem Öffnen einer Datei (wie einer Manpage).
2

Ich glaube --help ist Teil der ausführbaren Datei, es muss dort implementiert werden. Aus diesem Grund sehen Sie verschiedene Versionen von --help, manchmal ist -h Kurzschrift erlaubt, andere ist die nicht vorangestellte "Hilfe" ...

Bearbeiten

Ich habe einen Teil Ihrer Frage falsch verstanden. Ich bin mit dem Innenleben des "Hilfe" -Befehls selbst nicht vertraut.

Jon Surrell
quelle
Wie findet der Befehl helpdie Informationen eines anderen Befehls?
Tim