Membaca dan mencari halaman manual yang panjang


32

Saya akhirnya bosan ketika ingin membaca tentang pesta 's readdan itu -spilihan dengan man bash. Saya akhirnya menemukan tempat yang tepat (sekitar baris 4500), tetapi itu membuat frustrasi seperti biasa, karena keduanya /readdan bahkan /\s-s\spencarian memiliki terlalu banyak kecocokan.

Jadi, pertanyaannya adalah: Bagaimana saya bisa membaca halaman manual yang panjang secara efisien, atau mendapatkan informasi yang sama dengan cara lain, secara lokal ? Sebagai contoh spesifik, bagaimana mencapai dokumentasi yang relevan setelah melihat read -s pwddalam skrip shell? Jawaban yang bagus bisa berupa potongan skrip shell, atau petunjuk tentang beberapa alat dan bagaimana alat itu digunakan, atau sesuatu yang lain sama sekali, asalkan itu membantu dalam menemukan tempat yang tepat untuk dibaca.

Catatan: Saya tidak memberi tag dengan karena saya ingin pertanyaannya adalah tentang membaca halaman manual secara umum, meskipun itu sangat mungkin adalah halaman manual humongous yang paling sering ditemui.


Saya tidak menempatkan ini sebagai jawaban karena mungkin di luar kebutuhan Anda tetapi: ketika saya perlu membaca manhalaman yang panjang saya menggunakan skrip kecil saya meninggalkan di panel atas saya. yuugian.com/demo/gkman.txt Bagikan dan nikmati
Yuugian

Saya tidak menempatkan ini sebagai jawaban juga;) karena ini memang tentang bashdirinya sendiri: sama seperti Anda, saya juga sebagian besar membutuhkan SHELL BUILTINSbagian dari manual, yaitu sekitar 3500 baris . Jadi mengetahui ini, waktu berikutnya saya hanya akan mengatakan man bashdan kemudian turun 66 persen, dengan mengetik 66%, lalu beberapa kali PgDn dan saya di sana. Walaupun saya memilih 66 karena dapat dihafal sebagai "Rute 66" , sebenarnya sedikit lebih dari itu, meskipun tidak begitu mudah untuk menghafal kecuali itu adalah awal dari ponsel Anda #, dll. :) Setidaknya "Rute 66" "bersifat universal dan dikenal di seluruh dunia.
syntaxerror

Jawaban:


33

Untuk mendapatkan bantuan cepat pada Bash bawaan, gunakan help:

help read

adalah apa yang kamu inginkan.

Untuk pemformatan seperti halaman manual, gunakan

help -m read

atau, bahkan lebih baik,

help -m read | less

Jika Anda masih bersikeras mencarinya di halaman manual, saya menemukan apa yang dengan cepat membawa saya ke penjelasan perintah

/^\s*read [[]

Ini berfungsi karena ketika suatu perintah pertama kali dijelaskan, namanya sedikit indentasi dari awal baris. Dalam kasus tertentu read, ini memerlukan sedikit penelusuran sebelum Anda sampai ke readdokumentasi yang sebenarnya karena (karena alasan yang jelas) kata "baca" banyak diulang di seluruh halaman manual. The [[] berarti untuk mencocokkan [yang biasanya mendahului parameter opsional. (Saya biasanya meninggalkan / ^ \ s * dan cukup melakukan / <perintah bawaan> [[])

Alternatif lain

Jika Anda tidak keberatan perubahan format, Anda dapat mengonversi halaman manual Anda menjadi file DVI atau PDF:

man -T dvi bash >bash.dvi

atau

man -T ps bash | ps2pdf - bash.pdf # Requires the Ghostscript suite for ps2pdf

Tentu saja, mengingat dokumen DVI atau PDF, Anda kemudian dapat melakukan pencarian teks dengan mudah.


Hmm, itu helphebat, saya bertanya-tanya bagaimana saya belum pernah mendengarnya ... ps2pdftidak berguna karena tidak dapat (tampaknya) membuat indeks dalam bentuk apa pun.
hyde

@hyde Tidak yakin apa yang Anda maksud dengan membuat indeks, tetapi apakah Anda pernah mendengar tentang ptx ?
Joseph R.

Indeks atau Daftar Isi, bahwa "ptx" terdengar persis seperti yang saya maksud.
hyde

1
Alternatif lain yang lebih sederhana adalah dengan melakukan 'man bash> bashman.txt'. Kemudian Anda bisa membuka bashman.txt di jendela (lain) di editor teks Anda dan menggunakan semua perintah itu untuk menemukan apa yang Anda inginkan. Anda bahkan dapat mengedit file untuk menambahkan tag untuk bagian yang paling sering Anda rujuk. Membuat bashman.txt hanya-baca membantu sehingga Anda tidak memodifikasinya secara tidak sengaja di editor Anda.
Joe

Anda juga dapat membuka halaman manual di browser pilihan Anda dan menggunakan semua alatnya. Lihat askubuntu.com/questions/339255/…
Joe

9

Pendekatan 1

man bashlalu /read \[kemudian/-s

Pendekatan 2

Anda dapat mencoba alat sumber terbuka untuk menjelaskan argumen baris perintah yang disebut menjelaskan .

Ini dapat digunakan secara lokal. Baca dokumentasi di https://github.com/idank/explainshell

Peringatan: Biasanya berfungsi, tetapi hanya dengan perintah yang ditemukan di repositori manpage Ubuntu

Dalam kasus Anda, itu tidak dapat mengenali -ssaklar read -s pwd.

Pendekatan 3

Saya telah menemukan alat lain yang tampaknya menjanjikan tetapi tidak berfungsi pada sistem saya.

jelaskan: Dokumentasi Pendek untuk Perintah Unix


Dengan pendekatan 1, Anda dapat melakukan /-s\buntuk menghindari hit like --some-other-command(sambil tetap menemukan string seperti -s,, yang tidak akan Anda dapatkan jika Anda mencari /-sdengan spasi).
David Knipe

8

Apa yang biasanya saya lakukan dalam hal ini adalah jalankan saja man, cari SHELL BUILTIN COMMANDSheading, lalu cari builtin, yaitu

man bash
/^SHELL BUILTIN
/  read 

Namun, dalam bash Anda bisa melakukannya

help read

atau, tergantung pada sistem, salah satu dari

man 1 read
man bash-builtins

Secara umum, saya memiliki skrip yang disebut he("bantuan singkat") untuk melakukan ini. Anda akan menjalankannya seperti ini:

he bash read

FYI, saya berganti nama descmenjadi he. github.com/mikelward/scripts/blob/master/he
Mikel

3

Tidak ada cara umum untuk menemukan informasi di halaman manual, tidak ada cara umum untuk menemukan informasi dalam buku. Itu tergantung pada apa yang Anda cari.

Saat Anda mencari informasi tentang shell builtin, Anda dapat mencari builtin di awal baris, menyimpan lekukan, dan diikuti oleh spasi: search ^ *read␣(mis. Type /^ *read␣ Enter) ( adalah spasi). Ini bekerja dengan tanda hubung, pdksh, mksh dan bash. Halaman manual Zsh terpecah sehingga Anda perlu membaca zshbuiltinshalaman manual. Ksh93 memiliki simbol khusus sebelum nama beberapa bawaan, Anda perlu mencari ^ *†*␣di UTF-8 atau ^ *-*␣di ASCII. Ada beberapa positif palsu tetapi ini akan membuat Anda cepat ke jalur yang benar. Mencari ^ *read($| [-[])mengurangi jumlah positif palsu.

Anda dapat mempercepat pencarian dengan memberi tahu pager Anda ke mana Anda ingin pergi. Misalnya PAGER='less "+/^ *read \["' man bashmembuka halaman bash man pada deskripsi readbuiltin. Anda dapat membuat ini fungsi:

man-builtin () {
  PAGER="less '+/^ *$1(\$|\\[|-)'" man ${SHELL##*/}
}

Di halaman mkshmanual, / read (dua spasi, nama perintah, satu spasi) biasanya menemukan tempat yang tepat (ini adalah trik yang saya gunakan sendiri, dan cepat untuk mengetik). Terima kasih telah menanyakannya; Saya akan menempatkan membuat (agak) referensi terpisah untuk semua utilitas yang disertakan dengan mksh di TODO saya.
mirabilos

1
@mirabilos / read cenderung memiliki banyak false positive ketika implementasi man Anda membenarkan teks.
Gilles 'SO- stop being evil'

Sepakat. Bahkan lebih banyak alasan untuk benar-benar memisahkan dokumentasi bawaan.
mirabilos

1

Untuk melompat langsung ke bagian SHELL BUILTINS COMMANDS di halaman bash man, saya mendefinisikan alias berikut di $HOME/.bash_aliasesfile saya .

alias man-builtin="man -P 'less -p ^SHELL\ BUILTIN\ COMMANDS' bash"

0

Hanya untuk menawarkan alternatif lain, jika Anda lebih suka menggunakan browser web yang memungkinkan Anda untuk dengan mudah mencari melalui halaman saat ini, Anda dapat menggunakan sesuatu seperti man.cgi yang digunakan di freeBSD.org yang juga memungkinkan Anda melihat halaman manual dari berbagai sistem untuk melihat bagaimana mereka berbeda. Saya telah melihat yang serupa di situs lain jadi saya berharap ada variasi lain di sekitar.

Tautan bantuan dalam apropos menawarkan beberapa info untuk mendapatkan salinan skrip untuk diletakkan di server Anda sendiri dengan tautan untuk mengunduh koleksi halaman manual.


0

Saya sempat membuat fungsi bash untuk tujuan itu. Cuplikan ini dapat misalnya ditempel di akhir ~/.bashrc:

manfind() {
  # required args
  test "$1" -a "$2" || return 1                  

  # create temp file and get its name
  local tmp=$(mktemp /tmp/manfindXXXXXX) || return 1
  ( # subshell for trap
    trap "rm $tmp" EXIT

    # grep all matching lines with line numbers and pipe them to dialog
    if man "$1" |                   # get the whole man page
      grep -n "^\s*$2" |            # grep for the search string, with line nums
      sed 's/:/\n/' |               # replace line num separator with newline for dialog
      cut -c-70  |                  # cut long lines to nice length
      xargs -d'\n' -n 999999 \
        dialog --output-fd 3 --menu "Select line to go to" 0 0 0 3>$tmp -- 1 '(start of man page)'
    then
      # selected line number is now in $tmp, get man page and
      # use vim in read only mode to view it at right line
      man "$1" | vim -R +"$(< $tmp)" -
    else
      # cancel selected from dialog
      exit 1
    fi
  )
}

Komentar menjelaskan sedikit tentang apa fungsinya. String pencarian default pada pencarian tertentu diberikan kata dari awal baris, melompati ruang awal. Contoh:

# find every line which starts with 'read' followed by space
manfind bash 'read '
# research bash subshells
manfind bash '.*subshell'

Catatan: Skrip ini tidak memiliki konsep bagian halaman manual ... Saya akan melihat apakah saya mengubah itu nanti, tetapi mengatur MANSECTvariabel lingkungan dari man membantu.


2
Anda mungkin ingin menambahkan jebakan untuk membersihkan file sementara:trap 'rm -f "$tmp"'
l0b0

1
Ini terlihat sangat rumit. Saya belum sepenuhnya membaca apa yang skrip Anda lakukan, tetapi tidak akan man "$1" | vim -R - "+/$2"melakukan hal serupa?
Gilles 'SANGAT berhenti menjadi jahat'

@Gilles I yang akan pergi ke kejadian pertama $2, jadi tidak.
hyde

@ l0b0 Berubah pembersihan untuk digunakan trap. Saya tidak menemukan cara yang bersih untuk melakukannya dalam suatu fungsi tanpa membuat subkulit.
hyde

@hyde Sesuaikan regex dengan apa yang Anda lakukan, tentu saja. Maksud saya adalah tentang menggunakan+/REGEX
Gilles 'SO- stop being evil'

0

Menyatukan potongan-potongan dari diskusi lain di sini di sini adalah fungsi cepat yang dapat Anda tinggalkan di Anda .bashrcyang akan membawa Anda langsung ke built-in (jika ada). Kalau tidak terbuka manseperti biasa:

man() {
    case "$(/bin/bash -c 'type -t '"$1")" in 
        builtin)
            LESS=+?"^       $1 " command -p man bash
            ;;
        *)
            command -p man $@
            ;;
    esac
}

0

Dari distro Linux apa pun Anda harus dapat menggunakan info bashjika Anda ingin memiliki paragraf terpisah berdasarkan jenis tindakan di mana informasinya identik dengan halaman manual.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.