Apa sumber bantuannya?

8

help menampilkan informasi tentang perintah builtin. Apa sumber bantuannya? Apakah ia memelihara database untuk perintah builtin, atau apakah ia membaca beberapa file dari setiap perintah builtin (mirip dengan halaman manual masing-masing utilitas)?

Kadang-kadang saya menemukan informasinya tampaknya memperluas dengan --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.

Saya pikir helpekstrak bagian bantuan yang dapat dieksekusi, tetapi untuk skrip python pdf-merge.py , tidak

$ 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
sumber
3
Hanya untuk memperjelas, cdtidak memiliki --helpopsi. Apa yang Anda lihat adalah pesan penggunaan dasar yang Anda dapatkan ketika mencoba menggunakan bendera opsi yang tidak valid.
terdon
Lihat juga manperintah, dan dalam sistem yang mendukungnya infoperintah.
keshlam

Jawaban:

19

help adalah bash builtin dan hanya memberi Anda detail bash builtin lain dari buildtime.

Sumber untuk helpdihasilkan pada waktu kompilasi dari deffile di direktori builtin dari pohon sumber bash. Jika Anda melihat kode sumber bantuan dan cdAnda akan melihat bahwa informasi tersebut adalah bagian dari $SHORT_DOC. helpmenggunakan array yang dipanggil shell_builtinsuntuk mengakses informasi.

Ulrich Dangel
sumber
1
Bukti lebih lanjut:strings /bin/bash | grep 'Change the current directory to DIR'
200_success
12

Kadang-kadang saya menemukan informasinya tampaknya memperluas itu dengan --help

help cddan cd --helppada dasarnya berbeda. helpadalah perintah yang dibangun ke dalam shell, dan itu memberikan informasi tentang perintah lain yang dibangun ke dalam shell , artinya, mereka tidak dapat dieksekusi sendiri, mereka adalah fitur, misalnya bash,. Ini bisa sedikit membingungkan karena beberapa perintah bawaan juga memiliki versi yang dapat dieksekusi mandiri. Dalam hal ini, mereka biasanya memiliki halaman manual sendiri, dan akan memaparkan jalur yang dapat dieksekusi jika Anda bertanya which [command]. Informasi di halaman manual, atau dari [command] --helpadalah untuk dieksekusi; info dari help [command]untuk built-in, tapi semoga semuanya kurang lebih sama. Jika Anda mencari halaman manual untuk perintah yang hanya built-in, Anda mungkin akan mendapatkan halaman untuk shell yang mencantumkan semua perintah bawaannya.

--help(termasuk formulir pendek -h) hanyalah label konvensional untuk opsi baris perintah ke file yang dapat dieksekusi. Banyak, tetapi tidak semua, alat CLI mengimplementasikan ini, tetapi mereka tidak terikat dan informasi yang diberikan tergantung sepenuhnya pada implementasi. Jika Anda menjalankan --helpshell built-in, Anda kemungkinan mendapat "opsi tidak valid" dan pesan "penggunaan" singkat. Jika Anda memintanya pada standalone yang tidak mengimplementasikannya, Anda juga bisa mendapatkan "opsi tidak valid", tetapi apa yang terjadi lagi tergantung pada aplikasi.

Jika ada versi built-in dan standalone dari sebuah perintah yang tersedia dan Anda ingin tahu mana yang digunakan ketika Anda memintanya, Anda bisa menggunakan type, shell lain built-in.

> 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

Di sini kita dapat melihat bahwa meskipun ada eksekusi mandiri echo, echoshell Anda memanggil built-in.

goldilocks
sumber
1
Tidak perlu mengetik typedua kali: type -a echomengembalikan semua panggilan ke echodalam jangkauan Anda (sebagaimana didefinisikan oleh $ PATH), termasuk bawaan, fungsi shell dan alias. Lihat help typeuntuk referensi.
Tatjana Heuser
8

Anda sudah menjawab pertanyaan Anda sendiri:

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.

Bantuan adalah perintah BUILTIN (artinya, bash perintah internal) untuk mendapatkan informasi dari perintah bawaan lainnya. Karena skrip bagian ketiga ini bukan merupakan perintah bash. Jika Anda menjalankan bash, panggil builtin helpsuatu penggunaan straceyang akan Anda dapatkan:

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

Cukup banyak berarti bahwa informasi ini dihasilkan saat membangun di dalam biner bash.


sumber
Mereka bukan kode keras tetapi dihasilkan pada waktu membangun
Ulrich Dangel
Terima kasih. (1) Apa yang Anda maksud dengan "panggil bantuan builtin suatu strace penggunaan"? (2) informasi penggunaan hard-coded di executable dari perintah built-in cd?
Tim
@UlrichDangel - Terima kasih atas corretionnya. Hard-kode berkaitan dengan sesuatu yang diperbaiki pada kode sumber, dan tidak di dalam biner selama waktu kompilasi. Buruk saya;) @Tim. straceadalah alat untuk melihat apa yang dilakukan perintah yang ditentukan saat dalam eksekusi (pustaka, panggilan sistem, file dibuka, dll). Metode ini writemenunjukkan bahwa informasi bantuan berasal dari dalam biner (bash) saat menggunakan perintah bantuan builtin, dan bukan dari membuka file (seperti halaman manual).
2

Saya percaya --help adalah bagian dari executable, itu harus diimplementasikan di sana. Itu sebabnya Anda melihat versi yang berbeda dari --help, kadang-kadang -h singkatan diperbolehkan, yang lain itu adalah "bantuan" yang tidak diawali ...

Edit

Saya salah membaca bagian dari pertanyaan Anda. Saya tidak terbiasa dengan pekerjaan dalam dari perintah "bantuan" itu sendiri.

Jon Surrell
sumber
Bagaimana cara perintah helpmenemukan informasi dari perintah lain?
Tim