Wie erstelle ich eine spezielle erweiterbare Phrase in bash?


12

Ich tue es <command> --help | grep <feature>jeden Tag sehr, sehr oft. Ich habe mich gefragt, ob es möglich ist, so etwas zu machen ^^, "--help | grep"und dann mache ich Folgendes:

ls ^^ size

Das würde folgendes ausführen:

ls --help | grep size

Antworten:


17

Sie können dafür eine Bash-Funktion verwenden:

Fügen Sie Folgendes in Ihre ~ / .bashrc ein:

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

Wenn Sie speichern Ihre bashrc do source ~/.bashrcdann können Sie tun:

$ 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
Sie sollten $ 1 und $ 2 zitieren. Ich würde dies ändern in: qh () { type -all "$1" ; { "$1" --help || man "$1" ;} | egrep -i -- "$2" ;} # daher könnten Sie: qh ls Größe, qh ls "etwas | anderes" usw. Das (optionale) type -all "$1"fügt auch die Information über $ 1 hinzu: es sagt, ob Sie einen Alias, eine Funktion, ein befehl usw. Und es gibt Informationen von Mann "$ 1" aus, wenn der Befehl $ 1 nicht die Option "--help" hatte (dies passiert manchmal)
Olivier Dulac

1
@OlivierDulac Kannst du bitte etwas mehr über Typ -all "$ 1" erklären? In welchem ​​Fall wird es notwendig sein?
tgwtdt

Meine Version von type (kubuntu 16.04) weiß Bescheid -a, sagt aber nichts über -loder aus -all, aber die Funktion funktioniert.
Joe

15

Mit würden zshSie einen globalen Alias ​​verwenden:

$ 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)

Mit bashkönnen Sie möglicherweise die Verlaufserweiterung verwenden, die bei der Syntaxanalyse der Shell früh genug eintritt, um eine Pipe zu ersetzen:

  1. Füllen Sie den Verlauf mit dem Text, den Sie ersetzen möchten, und einem Sonderzeichen, das Sie sonst wahrscheinlich nicht verwenden (wie £hier auf meiner Tastatur):

     $ --help $(: £)|grep
     bash: --help: command not found
     Usage: grep [OPTION]... PATTERN [FILE]...
     Try 'grep --help' for more information.
  2. Verwenden Sie dann die Verlaufserweiterung, um Folgendes abzurufen:

    $ 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

Oder man könnte readlineerweitern --help|grepauf irgendeine Taste oder Tastenfolge drücken. Damit dies bashnur für (und nicht für andere Anwendungen wie die gdbVerwendung von readline) gilt, können Sie den in bindbash eingebauten Befehl verwenden, der die bashAPI für die Konfiguration darstellt readline, zum Beispiel in Ihrem ~/.bashrc:

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

Oder fügen Sie zu Ihrer ~/.inputrc(readline's Konfigurationsdatei) hinzu:

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

(es gibt auch andere Shells wie rcoder esdass die Verwendung readline- und wo das Sinn macht Bindung tun könnte , aber AFAICT, sie die nicht gesetzt rl_readline_nameVariable vor dem Aufruf , readlineso dass Sie nicht in der Lage sein werden , einige hinzufügen $iffür sie Aussagen (sie als würde zeigen , otherwie alle Anwendungen die readline verwenden, ohne ihren Anwendungsnamen anzugeben)).

Beachten Sie, dass Sie die Sekunde ^innerhalb einer halben Sekunde (standardmäßig) nach der ersten eingeben müssen, damit die Ersetzung erfolgt.


Können Sie die readline-Lösung ein bisschen näher erläutern ?! Wo soll ich diese Bindung hinzufügen? Auf welche Anwendungen wird sich diese Bindung ausweiten?
Yukashima Huksay

@yukashimahuksay, siehe Bearbeiten
Stéphane Chazelas

8

Sie können Readline-Bindungen verwenden:

füge eine Zeile hinzu wie

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

zu Ihrer ~ / .inputrc

Drücken Sie dann in Ihrer Amtszeit ^ X ^ R und die Bindung wird aktiviert.

Das Keying ls ^^führt nun zu ls --help | grep.


Ich antwortete, bevor ich sah, dass Stephane die Readline-Lösung hinzugefügt hatte. Ich habe meine Antwort gelöscht, aber dann wieder gelöscht, als ich den Kommentar sah, in dem nach Details für die Readline-Lösung
gefragt wurde

2
Darauf habe ich in meiner Antwort jetzt noch näher eingegangen.
Stéphane Chazelas

1
Gezielte Antworten wie Ihre und umfassende wie die von Stéphane haben ihren Platz. Habe ein positives Votum!
Bischof

5

Verwenden Sie less, um die Hilfemeldung anzuzeigen

Möglicherweise ist es hilfreich, den umgebenden Kontext der Zeilen zu sehen, die Ihrer Suchanfrage entsprechen.

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

Die Syntax zum Aufrufen dieser bashFunktion ähnelt der Funktion qhin der Antwort von @ tgwtdt, wobei das erste Argument der zu überprüfende Befehl und das zweite Argument der Suchbegriff ist. Beispielsweise:

hh ls size
hh ls "symbolic link"

Dies öffnet die vollständige Hilfemeldung in less, hebt jede Instanz des Suchbegriffs hervor und führt einen Bildlauf zur ersten Instanz des Suchbegriffs durch. Sie können dann drücken, num vorwärts zur nächsten Zeile mit dem Suchbegriff zu blättern, nerneut zum nächsten usw. Um zu einer vorherigen Instanz zurückzukehren, drücken Sie N. Verwenden Sie die Home, End, Page Up, Page Down, Up Arrow, und Down ArrowTasten für die allgemeine Navigation. Drücken Sie qoder, Qum das Menü zu verlassen lessund zur Befehlszeile zurückzukehren.


3

Ich mochte die Lösung von @tgwtdt, also habe ich sie ein bisschen verbessert.

Dies macht dasselbe, aber es geht ein wenig um Fehler und versucht auch, eingebaute Funktionen zu verarbeiten.

qh verwendet () anstelle von {}, daher sind qh1 () und out lokal (in einer 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"
) 
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.