Leggere e cercare pagine man lunghe


32

Ho finalmente stufo quando si vuole leggere su bash 's readed è -sl'opzione con man bash. Ho trovato il posto giusto alla fine (intorno alla linea 4500), ma è stato un frustrante come al solito, dal momento che entrambi /reade anche /\s-s\sle ricerche hanno troppi partite.

Quindi, la domanda è: come posso leggere in modo efficiente le pagine man lunghe o ottenere le stesse informazioni in altri modi, localmente ? Come esempio specifico, come raggiungere la documentazione pertinente dopo aver visto read -s pwdin uno script di shell? Una buona risposta potrebbe essere uno snippet di script della shell, o un suggerimento su alcuni strumenti e su come viene utilizzato, o qualcos'altro interamente, purché aiuti a trovare il posto giusto da leggere.

Nota: non taggo con perché voglio che la domanda riguardi la lettura della pagina man in generale, anche se è molto probabile che sia la pagina man humongous più comunemente incontrata.


Non lo sto mettendo come una risposta perché potrebbe essere al di fuori dei tuoi requisiti, ma: quando ho bisogno di leggere una lunga manpagina, uso un piccolo script che lascio sul mio pannello superiore. yuugian.com/demo/gkman.txt Condividi e divertiti
Yuugian

Non lo sto nemmeno dando una risposta;) perché in effetti riguarda bashse stesso: proprio come te, anch'io ho soprattutto bisogno della SHELL BUILTINSparte del manuale, che si trova alla linea 3500 circa . Quindi, sapendo questo, la prossima volta vorrei solo dire man bashe poi scendere del 66 percento, digitando 66%, quindi alcune volte PgDn e ci sono. Anche se ho scelto 66 perché può essere memorizzato come "Route 66" , in realtà è un po 'più di quello, anche se non è così facile da memorizzare a meno che non sia l'inizio del tuo numero di telefono, ecc. :) Almeno la "Route 66 "è universale e conosciuto in tutto il mondo.
syntaxerror,

Risposte:


33

Per ottenere rapidamente assistenza su un built-in Bash, utilizzare help:

help read

è quello che vuoi.

Per una formattazione simile a una pagina man, utilizzare

help -m read

o, meglio ancora,

help -m read | less

Se insisti ancora a cercarlo nella pagina man, trovo quello che mi porta rapidamente alla spiegazione di un comando

/^\s*read [[]

Questo funziona perché quando un comando viene spiegato per la prima volta, il suo nome viene leggermente rientrato dall'inizio della riga. Nel caso particolare di readquesto, ci vuole un po 'di navigazione prima di arrivare alla readdocumentazione effettiva perché (per ovvi motivi) la parola "leggi" viene ripetuta molto nella pagina man. Il [[] significa abbinare un [che di solito precede i parametri opzionali. (Di solito lascio fuori / ^ \ s * e faccio semplicemente / <comando incorporato> [[])

Un'altra alternativa

Se non ti dispiace il cambio di formato, puoi convertire la tua pagina man in un file DVI o PDF:

man -T dvi bash >bash.dvi

o

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

Naturalmente, dato un documento DVI o PDF, è quindi possibile eseguire facilmente una ricerca di testo.


Hmm, helpè fantastico, mi chiedo come non ne abbia mai sentito parlare ... ps2pdfnon è così utile dal momento che non può (apparentemente) creare indici di alcun tipo.
hyde,

@hyde Non sai cosa intendi creando un indice, ma hai sentito parlare di ptx ?
Joseph R.,

Indice o indice, che "ptx" suona esattamente come quello che intendevo dire.
hyde,

1
Un'altra alternativa ancora più semplice è fare 'man bash> bashman.txt'. Quindi puoi semplicemente aprire bashman.txt in (un'altra) finestra nel tuo editor di testo e usare tutti i suoi comandi per trovare quello che vuoi. Puoi anche modificare il file per aggiungere tag per le sezioni a cui fai riferimento più spesso. Rendere bashman.txt di sola lettura aiuta a non modificarlo accidentalmente nel tuo editor.
Joe,

Puoi anche aprire le pagine man nel browser che preferisci e utilizzare tutti i suoi strumenti. Vedi askubuntu.com/questions/339255/…
Joe,

9

Approccio 1

man bashallora /read \[allora/-s

Approccio 2

È possibile provare uno strumento open source per spiegare gli argomenti della riga di comando chiamati spiegahell .

Può essere usato localmente. Leggi la documentazione su https://github.com/idank/explainshell

Avvertenze: di solito funziona, ma solo con i comandi trovati nel repository manpage di Ubuntu

Nel tuo caso, non è in grado di riconoscere il -spassaggio read -s pwd.

Approccio 3

Ho trovato un altro strumento che sembra promettente ma non funziona sul mio sistema.

Spiegare: Breve documentazione per i comandi Unix


Con l'approccio 1, puoi fare /-s\bper evitare hit come --some-other-command(pur trovando stringhe come -s,, che non otterresti se cercassi /-scon uno spazio).
David Knipe,

8

Quello che faccio di solito in questo caso è semplicemente eseguire man, cercare l' SHELL BUILTIN COMMANDSintestazione, quindi cercare l'integrato, cioè

man bash
/^SHELL BUILTIN
/  read 

tuttavia, in bash puoi farlo

help read

oppure, a seconda del sistema, uno dei due

man 1 read
man bash-builtins

In generale, ho uno script chiamato he("breve aiuto") per farlo. Lo avresti eseguito in questo modo:

he bash read

Cordiali saluti, ho rinominato desca he. github.com/mikelward/scripts/blob/master/he
Mikel

3

Non esiste un modo generico per trovare informazioni in una pagina man, come non esiste un modo generico per trovare informazioni in un libro. Dipende da cosa stai cercando.

Quando cerchi informazioni su un built-in della shell, puoi cercare il built-in all'inizio di una riga, salvando il rientro e seguito da uno spazio: cerca ^ *read␣(es. Tipo /^ *read␣ Enter) ( è uno spazio). Funziona con dash, pdksh, mksh e bash. La pagina man di Zsh è divisa, quindi devi leggere la zshbuiltinspagina man. Ksh93 ha simboli speciali prima dei nomi di alcuni builtin, è necessario cercare ^ *†*␣in UTF-8 o ^ *-*␣in ASCII. Ci sono un paio di falsi positivi ma questo ti porterà rapidamente sulla linea giusta. La ricerca ^ *read($| [-[])riduce la quantità di falsi positivi.

Puoi velocizzare la ricerca dicendo al tuo cercapersone dove vuoi andare. Ad esempio, PAGER='less "+/^ *read \["' man bashapre la pagina man di bash sulla descrizione dell'integrato read. Puoi renderlo una funzione:

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

Nella mkshmanpage, / read (due spazi, il nome del comando, uno spazio) di solito trova il posto giusto (questo è un trucco che uso io stesso, ed è veloce da digitare). Grazie per avermelo chiesto; Metterò facendo (in qualche modo) riferimenti separati per tutte le utility incluse con mksh sul mio TODO.
mirabilos,

1
@mirabilos / read tende ad avere molti falsi positivi quando l'implementazione del tuo uomo giustifica il testo.
Gilles 'SO- smetti di essere malvagio' il

Concordato. Ancora più ragioni per dividere davvero la documentazione integrata.
mirabilos,

1

Per passare direttamente alla sezione SHELL BUILTINS COMMANDS della pagina man di bash, definisco il seguente alias nel mio $HOME/.bash_aliasesfile.

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

0

Solo per offrire un'altra alternativa, se si preferisce utilizzare un browser Web che consente di cercare facilmente nella pagina corrente, è possibile utilizzare qualcosa come man.cgi utilizzato su freeBSD.org che consente anche di visualizzare le pagine man da sistemi diversi per vedere come differiscono. Ho visto simili su altri siti, quindi mi aspetto che ci siano altre varianti in giro.

Il link di aiuto sotto apropos offre alcune informazioni per ottenere una copia dello script da mettere sul proprio server con link per scaricare le raccolte di pagine man.


0

Ho cercato di creare una funzione bash allo scopo. Questo frammento può essere ad esempio incollato alla fine di ~/.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
  )
}

I commenti spiegano un po 'cosa fa. La stringa di ricerca predefinita in particolare cerca una determinata parola dall'inizio delle righe, saltando lo spazio iniziale. Esempi:

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

Nota: questo script non ha il concetto di sezioni della pagina man ... Vedrò se lo aggiusterò più avanti, ma l'impostazione MANSECTdella variabile d'ambiente di man aiuta.


2
Potresti voler aggiungere una trap per ripulire il file temporaneo:trap 'rm -f "$tmp"'
l0b0

1
Sembra molto complicato. Non ho letto bene cosa fa la tua sceneggiatura, ma non man "$1" | vim -R - "+/$2"farei qualcosa di simile?
Gilles 'SO- smetti di essere malvagio' il

@Gilles I che sarebbe andato alla prima occorrenza di $2, quindi no.
hyde,

@ l0b0 Pulizia modificata da utilizzare trap. Non ho trovato un modo pulito per farlo in una funzione senza creare una subshell però.
hyde,

@hyde Adatta il regex a quello che stai facendo, ovviamente. Il mio punto era usare+/REGEX
Gilles 'SO- smetti di essere malvagio' il

0

Mettendo insieme i pezzi dell'altra discussione qui ecco una rapida funzione che puoi lasciare nella tua .bashrcche ti porterà direttamente al built-in (se esiste). Altrimenti si apre mannormalmente:

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

0

Da qualsiasi distro Linux dovresti essere in grado di usare info bashse vuoi avere paragrafi separati per tipo di azione in cui le informazioni sono identiche alle pagine man.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.