Wie leite ich die Liste der Befehle weiter, die von "tab complete" angezeigt werden?


12

Wenn ich Befehle in Bash verwende, mag ich die Option mit zwei Registerkarten, um die verfügbaren Befehle anzuzeigen. Einige Befehle haben mehr mögliche Übereinstimmungen als andere:

Screenshot einer Tab-Vervollständigung http://img13.imageshack.us/img13/5541/picturemhy.jpg

Gibt es eine Möglichkeit, die Ausgabe der doppelten Registerkarte an eine beliebige Stelle weiterzuleiten grep? Ich habe einen verwandten Beitrag gefunden , bin mir aber immer noch nicht sicher, wie ich ihn implementieren soll, um ihn an grep weiterzuleiten.


Wie genau stellen Sie sich vor, Sie würden in den grepregulären Ausdruck eintreten ? (y or n or g[rep])? Ich mag es nicht, pessimistisch zu klingen, aber ich bezweifle, dass dies möglich ist, ohne es dem Bash-Code hinzuzufügen.
Kevin

Antworten:


21

Für Befehle verwenden Sie compgen -c:

$ compgen -c bas
basename
base64
bashbug
bash
basename
base64
bashbug

Diese Ausgabe können Sie einfach durchleiten grep.


+1 Für den Befehl ... Der nächste interessante Teil könnte sein, wie man eine Tastenkombination dafür erstellt.
Rozcietrzewiacz

3

Basierend auf @ salutis Antwort habe ich ein Skript , das ich genannt compund gespeichert , ~/bin/compdass sucht commands‘, aliasesund builtins, (Optionsflag -cabsiehe die bash man Eintritt ), mit einem optionalen zweiten Parameter , die, falls vorhanden, Rohre die Ausgabe an grepund sucht nach der zweiter Parameter.

Usage: comp string [keyword-for-grep]

Code:

#!/bin/bash

if [ -z "$1" ]; then
    echo usage: comp string [keyword-for-grep]
    echo 
    exit
fi

if [ -z "$2" ]; then
    compgen -cab -- $1
    exit
fi

compgen -cab -- $1 | grep -i $2

Persönlich wäre ich auch daran interessiert, einen Weg zu finden, um den letzten Befehl aus dem Shell-Verlauf im Skript zu entfernen (etwas, das damit zusammenhängt history -d), damit bashich beim Durchsuchen des Verlaufs keine compEinträge finde . Ich weiß, dass ich das auch mit machen kann, HISTIGNOREaber Linux ist ziemlich mächtig, also muss es auch eine Möglichkeit geben, dies aus der Skriptdatei heraus zu tun - richtig?


1
Natürlich können Sie dies an Ihre Bedürfnisse anpassen, aber es sollte Ihnen den Einstieg erleichtern.
Markieren Sie den

-3

Warum nicht finden, wonach Sie suchen?

Beispiel:

find / -name ec2* -executable -type f -perm -og+rx -print

Wenn ich Ihren Anwendungsfall kenne, kann ich ein detaillierteres Befehlsbeispiel erstellen.


2
Mit anderen Worten, Sie können die Implementierung von Bash erneut implementieren. Sicher, aber das ist nicht praktisch und es geht nicht darum, worum es geht.
Gilles 'SO - hör auf böse zu sein'
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.