Каков источник помощи?

8

help отображает информацию о встроенных командах. Каков источник помощи? Поддерживает ли он базу данных для встроенных команд или читает некоторые файлы каждой встроенной команды (аналогично man-странице каждой утилиты)?

Иногда я нахожу, что его информация расширяет --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.

Я подумал helpизвлечь справочную часть исполняемого файла, но для сценария Python pdf-merge.py это не так

$ 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`
Тим
источник
3
Просто чтобы уточнить, cdне имеет --helpвыбора. То, что вы видите, - это базовое сообщение об использовании, которое вы получаете при попытке использовать недопустимый флаг опции.
Тердон
См. Также manкоманду и в системах, которые ее поддерживают, infoкоманда.
Кешлам

Ответы:

19

help является встроенным в bash, и предоставляет вам только подробности о других встроенных bash из времени сборки.

Источник для helpгенерируется во время компиляции из defфайлов во встроенных каталогах дерева исходных текстов bash. Если вы посмотрите на исходный код справки, и cdвы заметите, что информация является частью $SHORT_DOC. helpиспользует массив, вызываемый shell_builtinsдля доступа к информации.

Ульрих Дангел
источник
1
Еще strings /bin/bash | grep 'Change the current directory to DIR'
одно
12

Иногда я нахожу, что его информация расширяется на --help

help cdи cd --helpпринципиально разные. helpэто команда, встроенная в оболочку, и она предоставляет информацию о других командах, встроенных в оболочку , то есть они не являются собственными исполняемыми файлами, а являются, например, функциями bash. Это может немного запутать, поскольку некоторые встроенные команды также имеют автономные исполняемые версии. В этом случае у них обычно есть своя собственная страница справочника, и, если вы спросите, они предоставят путь для исполняемого файла which [command]. Информация в справочной странице или из [command] --helpпредназначена для исполняемого файла; информация от help [command]встроенного, но, надеюсь, они более или менее одинаковы. Если вы ищете страницу руководства для команды, которая является только встроенной, вы, вероятно, получите страницу для оболочки, в которой перечислены все ее встроенные команды.

--help(включая краткую форму -h) - это просто условная метка для параметра командной строки исполняемого файла. Многие, но не все, инструменты CLI реализуют это, но они не связаны, и предоставляемая информация полностью зависит от реализации. Если вы вызываете --helpвстроенную оболочку, вы, скорее всего, получите «недопустимый параметр» и краткое сообщение «использование». Если вы вызываете его в автономном режиме, который его не реализует, вы также можете получить «недопустимую опцию», но то, что произойдет снова, зависит от приложения.

Если доступны как встроенная, так и автономная версии команды, и вы хотите знать, какая из них используется при ее вызове, вы можете использовать typeдругую встроенную оболочку.

> 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

Здесь мы видим, что, хотя существует отдельный исполняемый файл echo, echoваша оболочка вызывает встроенную функцию.

лютик золотистый
источник
1
Не нужно вводить typeдважды: type -a echoвозвращает все вызовы в echoпределах вашей досягаемости (как определено $ PATH), включая встроенные функции, функции оболочки и псевдонимы. Смотрите help typeдля справки.
Татьяна Хойзер
8

Вы уже ответили на свой вопрос:

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.

Справка - это команда BUILTIN (значит, внутренняя команда bash) для получения информации о других встроенных командах. Так как этот третий скрипт не является встроенной командой bash. Если вы запустите bash, вызовите встроенное helpиспользование, которое straceвы получите:

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

В значительной степени это означает, что эта информация генерируется во время сборки внутри двоичного файла bash.


источник
Они не являются жестко закодированными, но генерируются во время сборки
Ульрих Дангел
Спасибо. (1) Что вы имеете в виду под "называть встроенную помощь использованием использования"? (2) информация об использовании жестко запрограммирована в исполняемом файле встроенной команды cd?
Тим
@UlrichDangel - Спасибо за исправление. Жестко запрограммированный относится к чему-то фиксированному в исходном коде, а не внутри двоичного файла во время компиляции. Мой плохой;) @ Тим. straceэто инструмент для просмотра действий определенной команды во время выполнения (библиотеки, системные вызовы, открытые файлы и т. д.). Метод writeпоказывает, что справочная информация поступает из двоичного файла (bash) при использовании встроенной команды help, а не при открытии файла (например, man-страницы).
2

Я считаю, --help является частью исполняемого файла, он должен быть реализован там. Вот почему вы видите разные версии --help, иногда -h разрешены сокращения, другие - это «без префикса» «помощь»…

редактировать

Я неправильно понял часть вашего вопроса. Я не знаком с какой-либо внутренней работой самой команды «помощь».

Джон Суррелл
источник
Как команда helpнаходит информацию другой команды?
Тим