Читання та пошук довгих сторінок чоловіка


32

Нарешті я втомився, коли хотів прочитати про bash 's, readі це -sваріант з man bash. Зрештою, я знайшов правильне місце (близько лінії 4500), але це було неприємно, як завжди, оскільки обидва /readі навіть /\s-s\sпошуки мають занадто багато збігів.

Отже, питання полягає в тому, як я можу ефективно читати сторінки довгих довідників або отримувати ту саму інформацію іншими способами, локально ? Як конкретний приклад, як дійти до відповідної документації після перегляду read -s pwdв сценарії оболонки? Хорошою відповіддю може бути фрагмент сценарію оболонки, або натяк на якийсь інструмент і як він використовується, або щось інше цілком, якщо це допоможе знайти правильне місце для читання.

Примітка: я не позначаю тому що я хочу, щоб питання стосувалося читання чоловічої сторінки в цілому, хоча це, можливо, є найчастіше зустрічається людиною, що часто зустрічається.


Я не ставлю це як відповідь, оскільки це може бути поза вашими вимогами, але: коли мені потрібно прочитати довгу manсторінку, я використовую невеликий сценарій, який я залишаю на своїй верхній панелі. yuugian.com/demo/gkman.txt Поділіться та насолоджуйтесь
липня 1313

Я не ставлю це як відповідь;) тому що це справді bashсамо по собі: як і ви, мені теж здебільшого потрібна SHELL BUILTINSчастина посібника, яка знаходиться приблизно в рядку 3500 . Знаючи це, наступного разу я просто скажу, man bashа потім знижусь на 66 відсотків, набравши 66%, потім кілька разів PgDn і я там. Хоча я вибрав 66, тому що його можна запам'ятати як "Маршрут 66" , насправді це трохи більше, але це не так просто запам'ятовується, якщо це не початок вашого телефону # тощо. Принаймні "Маршрут 66 "є універсальним і відомим у всьому світі.
синтаксичний помилок

Відповіді:


33

Щоб швидко отримати допомогу по вбудованому Bash, використовуйте help:

help read

це те, що ти хочеш.

Для форматування, подібного до чоловічої сторінки, використовуйте

help -m read

або, ще краще,

help -m read | less

Якщо ви все ще наполягаєте на тому, щоб шукати його на сторінці man, я знаходжу те, що швидко приводить мене до пояснення команди

/^\s*read [[]

Це працює, тому що коли команда вперше пояснюється, її назва злегка відступає від початку рядка. У конкретному випадку readце потребує невеликого перегляду, перш ніж перейти до фактичної readдокументації, оскільки (з очевидних причин) слово "читати" багато разів повторюється на всій сторінці людини. [[] Означає відповідати [[, що зазвичай передує необов'язковим параметрам. (Зазвичай я залишаю / ^ \ s * і просто виконую / <вбудовану команду> [[])

Ще одна альтернатива

Якщо ви не заперечуєте проти зміни формату, ви можете конвертувати свою чоловічу сторінку у файл DVI або PDF:

man -T dvi bash >bash.dvi

або

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

Звичайно, з урахуванням документа DVI або PDF, ви можете легко шукати текст.


Гм, helpце чудово, мені цікаво, як я ніколи про нього не чув ... ps2pdfне так корисно, оскільки не може (мабуть) створити індекс будь-якого типу.
hyde

@hyde Не знаєте, що ви маєте на увазі, створюючи індекс, але ви чули про ptx ?
Джозеф Р.

Покажчик або Зміст цього "ptx" звучить точно так, як я мав на увазі.
hyde

1
Інша, ще простіша альтернатива - це зробити "man bash> bashman.txt". Тоді ви можете просто відкрити bashman.txt у (іншому) вікні свого текстового редактора і використовувати всі його команди для пошуку того, що ви хочете. Ви навіть можете редагувати файл, щоб додавати теги до розділів, на які ви найчастіше звертаєтесь. Зробити bashman.txt лише для читання, щоб ви не змінили його випадково у своєму редакторі.
Джо

Ви також можете відкрити підручні сторінки в обраному веб-переглядачі та використовувати всі його інструменти. Дивіться askubuntu.com/questions/339255/…
Джо

9

Підхід 1

man bashто /read \[тоді/-s

Підхід 2

Ви можете спробувати інструмент з відкритим кодом для пояснення аргументів командного рядка під назвою обясните .

Його можна використовувати місцево. Прочитайте документацію на https://github.com/idank/explainshell

Caveats: Зазвичай працює, але тільки з командами, знайденими в сховищі Ubuntu manpage

У вашому випадку він не може розпізнати -sвхід read -s pwd.

Підхід 3

Я знайшов ще один інструмент, який здається перспективним, але він не працює в моїй системі.

поясніть: Коротка документація для команд Unix


З підходом 1 ви можете /-s\bуникнути подібних звернень --some-other-command(все ще знаходячи рядки типу -s,, яких ви не отримали, якщо шукали /-sз пробілом).
Девід Найпе

8

Що я зазвичай роблю в цьому випадку - це просто запустити man, пошукати SHELL BUILTIN COMMANDSзаголовок, потім шукати вбудований, тобто

man bash
/^SHELL BUILTIN
/  read 

однак, в баш можна зробити

help read

або, залежно від системи, будь-який із

man 1 read
man bash-builtins

Взагалі у мене є сценарій під назвою he("коротка допомога") для цього. Ви б запустили його так:

he bash read

FYI, я перейменований descна he. github.com/mikelward/scripts/blob/master/he
Мікель

3

Немає загального способу пошуку інформації на чоловічій сторінці, більше, ніж є загального способу пошуку інформації в книзі. Це залежить від того, що ви шукаєте.

Коли ви шукаєте інформацію про вбудовану оболонку, ви можете шукати вбудований на початку рядка, зберегти для відступу, а за ним пробіл: пошук ^ *read␣(наприклад, тип /^ *read␣ Enter) ( пробіл). Це працює з тире, pdksh, mksh та bash. Сторінка людини Zsh розділена, тому вам потрібно прочитати zshbuiltinsчоловічу сторінку. Ksh93 має спеціальні символи перед іменами деяких вбудованих, вам потрібно шукати ^ *†*␣в UTF-8 або ^ *-*␣в ASCII. Є кілька помилкових позитивних результатів, але це швидко приведе вас до правильної лінії. Пошук ^ *read($| [-[])зменшує кількість помилкових позитивних результатів.

Ви можете прискорити пошук, повідомивши пейджеру, куди ви хочете піти. Наприклад, PAGER='less "+/^ *read \["' man bashвідкривається сторінка bash man на описі readвбудованого. Ви можете зробити цю функцію:

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

У mkshсторінках керівництва, / read (два пробілу, ім'я команди, один пробіл) , як правило , знаходить потрібне місце (це виверт , яку я сам використовую, і швидко типу). Дякую за запитання про це; Я розміщую (дещо) окремі посилання на всі утиліти, включені до mksh, на свій TODO.
mirabilos

1
@mirabilos, / read як правило, має багато помилкових позитивних результатів, коли ваша реалізація чоловіком виправдовує текст.
Жил "ТАК - перестань бути злим"

Домовились. Ще більше причин по-справжньому розколоти вбудовану документацію.
mirabilos

1

Щоб перейти безпосередньо до розділу SHELL BUILTINS COMMANDS на сторінці bash man, я визначаю наступний псевдонім у своєму $HOME/.bash_aliasesфайлі.

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

0

Просто запропонувавши іншу альтернативу, якщо ви віддаєте перевагу використовувати веб-браузер, який дозволяє вам легко шукати через поточну сторінку, ви можете використовувати щось на зразок man.cgi, що використовується на freeBSD.org, що також дозволяє переглядати підручні сторінки з різних систем, щоб побачити, як вони відрізняються. Я бачив подібне на інших сайтах, тому очікую, що існують інші варіанти.

Посилання довідки під apropos пропонує деяку інформацію, щоб отримати копію сценарію, розміщеного на власному сервері, із посиланнями для завантаження колекцій чоловічої сторінки.


0

Я зайнявся створенням функції bash з цією метою. Цей фрагмент можна, наприклад, вставити в кінці ~/.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
  )
}

Коментарі трохи пояснюють, що це робить. Рядок пошуку за замовчуванням, зокрема, шукає слово з початку рядків, пропускаючи початковий пробіл. Приклади:

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

Примітка: Цей сценарій не має поняття розділів сторінки man ... Я побачу, чи зміню це пізніше, але налаштування MANSECTзмінної середовища man допомагає.


2
Ви можете додати пастку, щоб очистити тимчасовий файл:trap 'rm -f "$tmp"'
l0b0

1
Це виглядає дуже складно. Я не повністю прочитав, що робить ваш сценарій, але не man "$1" | vim -R - "+/$2"зробив би щось подібне?
Жил "ТАК - перестань бути злим"

@ Gilles Я б пішов на перше виникнення $2, так що ні.
hyde

@ l0b0 Змінено прибирання у використанні trap. Я не знайшов чистого способу зробити це у функції, хоча не створив підшару.
hyde

@hyde Звичайно адаптуйте регулярний вираз до того, що ви робите. Моя думка полягала у використанні+/REGEX
Жил "SO- перестань бути зла"

0

Збираючи разом фрагменти з іншої дискусії, ось ось швидка функція, яку ви можете залишити у своїй, .bashrcяка перенесе вас безпосередньо до вбудованого (якщо він існує). Інакше він відкривається manяк звичайний:

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

0

З будь-якого дистрибутиву Linux ви повинні мати можливість використовувати, info bashякщо ви хочете мати окремі абзаци за типом дії, де інформація є ідентичною сторонній сторінки.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.