Leer y buscar páginas de manual largas


32

Finalmente me harto cuando se quiere leer acerca de fiesta 's ready de -sopción con man bash. Finalmente encontré el lugar correcto (alrededor de la línea 4500), pero fue frustrante como siempre, ya que ambas /reade incluso las /\s-s\sbúsquedas tienen demasiadas coincidencias.

Entonces, la pregunta es: ¿Cómo puedo leer páginas man largas de manera eficiente u obtener la misma información de otras maneras, localmente ? Como ejemplo específico, ¿cómo llegar a la documentación relevante después de ver read -s pwden un script de shell? Una buena respuesta podría ser un fragmento de script de shell, o una pista sobre alguna herramienta y cómo se usa, o algo completamente diferente, siempre que ayude a encontrar el lugar correcto para leer.

Nota: No estoy etiquetando con porque quiero que la pregunta sea sobre la lectura de páginas de manual en general, aunque posiblemente esa sea la página de manual enorme más común.


No estoy poniendo esto como respuesta porque puede estar fuera de sus requisitos, pero: cuando necesito leer una manpágina larga , uso un pequeño script que dejo en mi panel superior. yuugian.com/demo/gkman.txt Compartir y disfrutar
Yuugian

No estoy poniendo esto como respuesta tampoco;) porque de hecho se trata de bashsí mismo: al igual que usted, también necesito principalmente la SHELL BUILTINSparte del manual, que se encuentra en la línea 3500 . Entonces, sabiendo esto, la próxima vez solo diría man bashy luego bajaría un 66 por ciento, escribiendo 66%, luego unas pocas veces PgDn y estoy allí. Aunque elegí 66 porque se puede memorizar como "Ruta 66" , en realidad es un poco más que eso, aunque no es tan fácil de memorizar a menos que sea el comienzo de su número de teléfono, etc. :) Al menos la "Ruta 66 "es universal y conocido en todo el mundo.
syntaxerror

Respuestas:


33

Para obtener ayuda rápidamente sobre un Bash incorporado, use help:

help read

es lo que quieres

Para el formato de página de manual, use

help -m read

o mejor,

help -m read | less

Si todavía insiste en buscarlo en la página de manual, encuentro que lo que rápidamente me lleva a la explicación de un comando es

/^\s*read [[]

Esto funciona porque cuando un comando se explica por primera vez, su nombre se sangra ligeramente desde el comienzo de la línea. En el caso particular de read, esto requiere un poco de exploración antes de llegar a la readdocumentación real porque (por razones obvias) la palabra "leer" se repite mucho en toda la página del manual. [[] Significa hacer coincidir un [que generalmente precede a los parámetros opcionales. (Normalmente dejo de lado / ^ \ s * y simplemente hago / <comando incorporado> [[])

Otra alternativa

Si no le importa el cambio de formato, puede convertir su página de manual a un archivo DVI o PDF:

man -T dvi bash >bash.dvi

o

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

Por supuesto, dado un documento DVI o PDF, puede hacer una búsqueda de texto fácilmente.


Hmm, eso helpes genial, me pregunto cómo nunca he oído hablar de él ... ps2pdfno es tan útil ya que aparentemente no puede crear índices de ningún tipo.
hyde

@hyde No estoy seguro de lo que quieres decir con crear un índice, pero ¿has oído hablar de ptx ?
Joseph R.

Índice o tabla de contenido, ese "ptx" suena exactamente como lo que quise decir.
hyde

1
Otra alternativa aún más simple es hacer 'man bash> bashman.txt'. Luego, puede abrir bashman.txt en (otra) ventana en su editor de texto y usar todos sus comandos para encontrar lo que desea. Incluso puede editar el archivo para agregar etiquetas para las secciones a las que se refiere con más frecuencia. Hacer bashman.txt de solo lectura ayuda para que no lo modifique por accidente en su editor.
Joe

También puede abrir páginas de manual en el navegador de su elección y usar todas sus herramientas. Ver askubuntu.com/questions/339255/…
Joe

9

Enfoque 1

man bashentonces /read \[entonces/-s

Enfoque 2

Puede probar una herramienta de código abierto para explicar los argumentos de la línea de comandos llamada explicahell .

Se puede usar localmente. Lea la documentación en https://github.com/idank/explainshell

Advertencias: generalmente funciona, pero solo con los comandos que se encuentran en el repositorio de la página de manual de Ubuntu

En su caso, no puede reconocer el -scambio read -s pwd.

Enfoque 3

He encontrado otra herramienta que parece prometedora pero que no funciona en mi sistema.

explicar: Documentación breve para los comandos de Unix


Con el enfoque 1, puede hacer /-s\bpara evitar golpes como --some-other-command(sin dejar de encontrar cadenas como -s,, que no obtendría si buscara /-scon un espacio).
David Knipe el

8

Lo que generalmente hago en este caso es simplemente ejecutar man, buscar el SHELL BUILTIN COMMANDSencabezado, luego buscar el incorporado, es decir

man bash
/^SHELL BUILTIN
/  read 

sin embargo, en bash puedes hacer

help read

o, dependiendo del sistema, cualquiera de

man 1 read
man bash-builtins

En general, tengo un script llamado he("ayuda breve") para hacer esto. Lo ejecutarías así:

he bash read

Para su información, Retitulé desca he. github.com/mikelward/scripts/blob/master/he
Mikel

3

No hay una forma genérica de encontrar información en una página de manual, como tampoco existe una forma genérica de encontrar información en un libro. Depende de lo que estés buscando.

Cuando está buscando información sobre un shell incorporado, puede buscarlo al comienzo de una línea, guardar la sangría, y seguido de un espacio: buscar ^ *read␣(por ejemplo, tipo /^ *read␣ Enter) ( es un espacio). Esto funciona con dash, pdksh, mksh y bash. La página de manual de Zsh está dividida, por lo que debe leer la zshbuiltinspágina de manual. Ksh93 tiene símbolos especiales antes de los nombres de algunas incorporaciones, debe buscar ^ *†*␣en UTF-8 o ^ *-*␣en ASCII. Hay un par de falsos positivos, pero esto lo llevará rápidamente a la línea correcta. La búsqueda ^ *read($| [-[])reduce la cantidad de falsos positivos.

Puede acelerar la búsqueda diciéndole a su localizador a dónde desea ir. Por ejemplo, PAGER='less "+/^ *read \["' man bashabre la página de manual de bash en la descripción del readbuiltin incorporado. Puedes hacer de esto una función:

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

En la página de mkshmanual, / read (dos espacios, nombre de comando, un espacio) generalmente encuentra el lugar correcto (este es un truco que uso yo mismo y es rápido de escribir). Gracias por preguntar al respecto; Pondré hacer referencias (algo) separadas para todas las utilidades incluidas con mksh en mi TODO.
mirabilos

1
@mirabilos / read tiende a tener muchos falsos positivos cuando su implementación de hombre justifica el texto.
Gilles 'SO- deja de ser malvado'

Convenido. Aún más razones para separar realmente la documentación incorporada.
mirabilos

1

Para saltar directamente a la sección SHELL BUILTINS COMMANDS de la página de manual de bash, defino el siguiente alias en mi $HOME/.bash_aliasesarchivo.

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

0

Solo para ofrecer otra alternativa, si prefiere usar un navegador web que le permita buscar fácilmente en la página actual, puede usar algo como man.cgi usado en freeBSD.org, que también le permite ver páginas man de diferentes sistemas para ver cómo difieren. He visto similares en otros sitios, así que espero que haya otras variaciones.

El enlace de ayuda debajo de apropos ofrece información para obtener una copia del script para poner en su propio servidor con enlaces para descargar las colecciones de páginas de manual.


0

Llegué a crear una función bash para este propósito. Este fragmento se puede pegar, por ejemplo, al final de ~/.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
  )
}

Los comentarios explican un poco sobre lo que hace. La cadena de búsqueda predeterminada en particular busca palabra dada desde el principio de las líneas, omitiendo el espacio inicial. Ejemplos:

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

Nota: Esta secuencia de comandos no tiene el concepto de secciones de la página de manual ... Veré si la modifico más tarde, pero establecer MANSECTla variable de entorno de man ayuda.


2
Es posible que desee agregar una trampa para limpiar el archivo temporal:trap 'rm -f "$tmp"'
l0b0

1
Esto se ve muy complicado. No he leído completamente lo que hace su script, pero ¿no man "$1" | vim -R - "+/$2"haría algo similar?
Gilles 'SO- deja de ser malvado'

@Gilles I que iría a la primera aparición de $2, así que no.
hyde

@ l0b0 Se cambió la limpieza para usar trap. Sin embargo, no encontré una forma limpia de hacerlo en una función sin crear una subshell.
hyde

@hyde Adapta la expresión regular a lo que estás haciendo, por supuesto. Mi punto era sobre usar+/REGEX
Gilles 'SO- deja de ser malvado'

0

Al reunir las piezas de la otra discusión aquí, aquí hay una función rápida que puede dejar en su cuenta .bashrcque lo llevará directamente a la función incorporada (si existe). De lo contrario, se abre mannormalmente:

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

0

Desde cualquier distribución de Linux, debería poder usarla info bashsi desea tener párrafos separados por tipo de acción donde la información es idéntica a las páginas de manual.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.