Чтение и поиск длинных страниц руководства

32

Я , наконец , надоело , когда хотят , чтобы прочитать о баш «ы readи это -sвариант с man bash. В конце концов я нашел правильное место (около строки 4500), но, как обычно, это было неприятно, так как оба /readи даже /\s-s\sпоиски имеют слишком много совпадений.

Итак, вопрос: как я могу эффективно читать длинные страницы руководства или получать ту же информацию другими способами на местном уровне ? Как конкретный пример, как добраться до соответствующей документации после просмотра read -s pwdв сценарии оболочки? Хорошим ответом может быть фрагмент сценария оболочки или подсказка о каком-либо инструменте и о том, как он используется, или что-то еще полностью, при условии, что он помогает найти правильное место для чтения.

Примечание: я не отмечаю тегом потому что хочу, чтобы вопрос касался чтения справочной страницы в целом, хотя это, вероятно, наиболее часто встречающаяся огромная справочная страница.

Хайд
источник
Я не ставлю это как ответ, потому что это может быть за пределами ваших требований, но: когда мне нужно прочитать длинную manстраницу, я использую небольшой скрипт, который я оставляю на верхней панели. yuugian.com/demo/gkman.txt Поделитесь и наслаждайтесь
Yuugian
Я также не ставлю это в качестве ответа;) потому что это действительно о bashсебе: так же, как и вам, мне тоже в основном нужна SHELL BUILTINSчасть руководства, которая находится примерно в строке 3500 . Итак, зная это, в следующий раз я просто скажу, man bashа затем уменьшусь на 66 процентов, набрав 66%, затем несколько раз PgDn, и я там. Хотя я выбрал 66, потому что его можно запомнить как «Маршрут 66» , на самом деле это немного больше, хотя запомнить его не так просто, если только это не начало вашего телефона # и т. Д. :) По крайней мере, «Маршрут 66» "универсален и известен во всем мире.
синтаксическая ошибка

Ответы:

33

Чтобы быстро получить помощь по встроенной функции Bash, используйте help:

help read

это то, что вы хотите.

Для форматирования, подобного man-странице, используйте

help -m read

или даже лучше,

help -m read | less

Если вы все еще настаиваете на поиске этого на странице руководства, я нахожу, что быстро приводит меня к объяснению команды:

/^\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 Не уверен, что ты имеешь в виду под созданием индекса, но слышал ли ты о ptx ?
Джозеф Р.
Указатель или оглавление, этот «ptx» звучит именно так, как я и имел в виду.
Хайд
1
Другая, еще более простая альтернатива - сделать man bash> bashman.txt. Затем вы можете просто открыть bashman.txt в (другом) окне вашего текстового редактора и использовать все его команды для поиска того, что вы хотите. Вы даже можете отредактировать файл, добавив теги к тем разделам, на которые вы ссылаетесь чаще всего. Создание bashman.txt только для чтения помогает избежать случайного изменения в вашем редакторе.
Джо
Вы также можете открыть справочные страницы в выбранном вами браузере и использовать все его инструменты. См. Askubuntu.com/questions/339255/…
Джо
9

Подход 1

man bashтогда /read \[тогда/-s

Подход 2

Вы можете попробовать инструмент с открытым исходным кодом для объяснения аргументов командной строки, называемый объясненный shell .

Это может быть использовано локально. Прочитайте документацию на https://github.com/idank/explainshell

Предостережения: обычно работает, но только с командами, найденными в репозитории man Ubuntu

В вашем случае он не может распознать -sпереключатель read -s pwd.

Подход 3

Я нашел другой инструмент, который кажется многообещающим, но он не работает в моей системе.

объяснение: краткая документация для команд Unix

Иван Чау
источник
При подходе 1 вы можете /-s\bизбегать таких ударов, как --some-other-command(при этом все еще находя такие строки, как -s,, которые вы не получите, если будете искать /-sс пробелом).
Дэвид Книп
8

В этом случае я обычно просто запускаю manпоиск SHELL BUILTIN COMMANDSзаголовка, затем поиск встроенного, т.е.

man bash
/^SHELL BUILTIN
/  read 

Тем не менее, в Bash вы можете сделать

help read

или, в зависимости от системы, любой из

man 1 read
man bash-builtins

В общем, для этого у меня есть скрипт he("краткая справка"). Вы бы запустили это так:

he bash read
Mikel
источник
К вашему сведению, я переименовал descв he. github.com/mikelward/scripts/blob/master/he
Микель,
3

Не существует общего способа поиска информации на странице руководства, равно как нет общего способа поиска информации в книге. Это зависит от того, что вы ищете.

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

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

man-builtin () {
  PAGER="less '+/^ *$1(\$|\\[|-)'" man ${SHELL##*/}
}
Жиль "ТАК - прекрати быть злым"
источник
В mkshman-странице / read (два пробела, имя команды, один пробел) обычно находит нужное место (это трюк, который я использую сам, и быстро набираю). Спасибо, что спросили об этом; Я добавлю (несколько) отдельные ссылки на все утилиты, включенные в mksh, в моем TODO.
Мирабилось
1
@mirabilos / read имеет много ложных срабатываний, когда ваша реализация оправдывает текст.
Жиль "ТАК ... перестать быть злым"
Согласовано. Еще одна причина по-настоящему отделить встроенную документацию.
Мирабилось
1

Чтобы перейти непосредственно к разделу «Команды SHELL BUILTINS» на справочной странице bash, я определил в своем $HOME/.bash_aliasesфайле следующий псевдоним .

alias man-builtin="man -P 'less -p ^SHELL\ BUILTIN\ COMMANDS' bash"
trellem
источник
0

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

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

sambler
источник
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"сделал бы что-то подобное?
Жиль "ТАК - перестань быть злым"
@ Жиль, я бы пошел в первое появление $2, так что нет.
Хайд
@ l0b0 Изменена очистка для использования trap. Я не нашел чистого способа сделать это в функции без создания подоболочки.
Hyde
@hyde Адаптируйте регулярное выражение к тому, что вы делаете, конечно. Моя точка зрения была об использовании+/REGEX
Жиль "ТАК - перестань быть злым"
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если хотите иметь отдельные параграфы по типу действий, в которых информация идентична страницам руководства.

admstg
источник