Come creare una speciale frase espandibile in bash?


12

Mi ritrovo a fare <command> --help | grep <feature>molto spesso ogni giorno. Mi chiedevo se fosse possibile fare qualcosa del genere ^^che si espande "--help | grep"e quindi faccio questo:

ls ^^ size

Ciò eseguirà quanto segue:

ls --help | grep size

Risposte:


17

È possibile utilizzare una funzione bash per questo:

Inserisci quanto segue nel tuo ~ / .bashrc:

qh() {
    type -all "$1" ; { man "$1" || "$1" --help ;} | egrep -i -- "$2"
}

Quando salvi il tuo bashrc do source ~/.bashrcallora puoi fare:

$ qh ls size
      --block-size=SIZE      scale sizes by SIZE before printing them; e.g.,
                               '--block-size=M' prints sizes in units of
  -h, --human-readable       with -l and/or -s, print human readable sizes
  -s, --size                 print the allocated size of each file, in blocks
  -S                         sort by file size, largest first
      --sort=WORD            sort by WORD instead of name: none (-U), size (-S),
  -T, --tabsize=COLS         assume tab stops at each COLS instead of 8

1
dovresti citare $ 1 e $ 2. Lo cambierei in: qh () { type -all "$1" ; { "$1" --help || man "$1" ;} | egrep -i -- "$2" ;} # quindi potresti: qh ls size, qh ls "qualcosa | altro" ecc. Il (opzionale) type -all "$1"aggiunge anche le informazioni su $ 1: dice che lancerai un alias, una funzione, un comando, ecc. E fornisce informazioni dall'uomo "$ 1" se il comando $ 1 non aveva l'opzione "--help" (questo succede a volte)
Olivier Dulac l'

1
@OlivierDulac Puoi per favore spiegare un po 'di più sul tipo -all "$ 1"? In che caso sarà necessaria?
tgwtdt,

La mia versione di tipo (kubuntu 16.04) è a conoscenza -a, ma non dice nulla su -lo -all, ma la funzione funziona.
Joe

15

Con zsh, useresti un alias globale :

$ alias -g '^^=--help|grep --color -i'
$ ls ^^ size
     --block-size=SIZE      scale sizes by SIZE before printing them; e.g.,
                              '--block-size=M' prints sizes in units of
                              1,048,576 bytes; see SIZE format below
 -h, --human-readable       with -l and/or -s, print human readable sizes
 -s, --size                 print the allocated size of each file, in blocks
 -S                         sort by file size, largest first
     --sort=WORD            sort by WORD instead of name: none (-U), size (-S),
 -T, --tabsize=COLS         assume tab stops at each COLS instead of 8
The SIZE argument is an integer and optional unit (example: 10K is 10*1024)

Con bash, potresti essere in grado di utilizzare l' espansione della cronologia, che si verifica abbastanza presto nell'analisi della sintassi della shell e che può funzionare per sostituire una pipe:

  1. Prime la storia con un testo che vuoi sostituire e un carattere speciale che difficilmente userai altrimenti (come £qui che si trova sulla mia tastiera):

     $ --help $(: £)|grep
     bash: --help: command not found
     Usage: grep [OPTION]... PATTERN [FILE]...
     Try 'grep --help' for more information.
    
  2. Quindi utilizzare l'espansione della cronologia per recuperarlo:

    $ ls !?£? size
    ls --help $(: £)|grep size
         --block-size=SIZE  scale sizes by SIZE before printing them; e.g.,
                              '--block-size=M' prints sizes in units of
     -h, --human-readable   with -l and/or -s, print human readable sizes
     -s, --size             print the allocated size of each file, in blocks
     -S                     sort by file size, largest first
         --sort=WORD        sort by WORD instead of name: none (-U), size (-S),
     -T, --tabsize=COLS     assume tab stops at each COLS instead of 8
    

Oppure avresti potuto readlineespandere la --help|greppressione di alcuni tasti o sequenze di tasti. Affinché ciò si applichi bashsolo (e non ad altre applicazioni come l' gdbutilizzo di readline), è possibile utilizzare il bindcomando incorporato bash che è bashl'API per la configurazione readline, ad esempio in ~/.bashrc:

bind '"^^": "--help|grep "'

Oppure aggiungi al tuo ~/.inputrc(file di configurazione di readline):

$if Bash
"^^": "--help|grep "
$endif

(ci sono altre shell simili rco esche usano readline e dove fare quell'associazione potrebbe avere senso ma AFAICT, non impostano la rl_readline_namevariabile prima di invocare, readlinequindi non sarai in grado di aggiungere alcune $ifistruzioni per loro (mostrerebbero othercome tutte le applicazioni che usano readline senza dirgli il nome dell'applicazione)).

Si noti che è necessario inserire il secondo ^entro mezzo secondo (per impostazione predefinita) dopo il primo affinché avvenga la sostituzione.


Puoi spiegare un po 'di più la soluzione readline ?! dove devo aggiungere quell'associazione? su quali applicazioni si espanderà tale associazione?
Yukashima Huksay,

@yukashimahuksay, vedi modifica
Stéphane Chazelas,

8

È possibile utilizzare i collegamenti readline:

aggiungi una riga come

"^^": "--help | grep "

al tuo ~ / .inputrc

Quindi premi ^ X ^ R nel tuo termine e la rilegatura verrà attivata.

La digitazione ls ^^ora comporterà ls --help | grep.


Ho risposto prima di vedere che Stephane aveva aggiunto la soluzione readline. Ho cancellato la mia risposta, ma poi ho cancellato, quando ho visto il commento che chiedeva dettagli sulla soluzione readline
Alex Stragies,

2
Ora ne ho aggiunto un po 'di più nella mia risposta.
Stéphane Chazelas,

1
Le risposte mirate come la tua e quelle globali come quella di Stéphane hanno entrambe il loro posto. Avere un voto!
vescovo

5

Utilizzo lessper visualizzare il messaggio di aiuto

Potresti trovare utile vedere il contesto circostante delle linee che corrispondono alla tua query di ricerca.

hh () { "${1}" --help | less -p "${2}" ; }

La sintassi per chiamare questa bashfunzione è simile alla funzione qhnella risposta di @ tgwtdt, con il primo argomento è il comando da esaminare e il secondo argomento è il termine di ricerca. Per esempio:

hh ls size
hh ls "symbolic link"

Questo apre il messaggio di aiuto completo less, evidenzia ogni istanza del termine di ricerca e scorre fino alla prima istanza del termine di ricerca. È quindi possibile premere nper scorrere in avanti fino alla riga successiva contenente il termine di ricerca, di nnuovo per il successivo e così via. Per tornare a un'istanza precedente, premere N. Utilizzare i Home, End, Page Up, Page Down, Up Arrow, e Down Arrowtasti per la navigazione in generale. Premere qo Qper uscire lesse tornare alla riga di comando.


3

Mi è piaciuta la soluzione di @tgwtdt, quindi l'ho migliorata un po '.

Questo fa la stessa cosa, ma fa un po 'per gestire gli errori e cerca anche di elaborare i built-in.

qh usa () invece di {}, quindi qh1 () e out sono locali (in una subshell).

function qh () (
    function qh1 () {
      out="$(help "$1" 2>&1 )"
      [ $? -ne 0 ] && return 1
      echo "$out"
    }

    type -all "$1" ; { qh1 "$1" || "$1" --help 2>/dev/null || man "$1" 2>/dev/null ;} | egrep -i -- "$2"
) 
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.