Ich möchte bash anweisen, eine spezielle Methode zu verwenden, um bestimmte Verzeichnisnamen zu vervollständigen. Zum Beispiel würde bash ein Programm von mir aufrufen, um die Fertigstellung durchzuführen, wenn ein Pfad mit "$$" beginnt, und ansonsten die Fertigstellung normal durchführen.
Ist das überhaupt möglich? Wie würden Sie es implementieren?
Bounty : Ich würde mich sehr über eine Antwort auf diese Frage freuen. Ziel ist es, dem automatischen Sprung zu ermöglichen , Pfade für alle Befehle zu vervollständigen, wenn der Benutzer sie mit einem bestimmten Präfix startet. Wenn Sie beispielsweise eine Datei aus einem entfernten Verzeichnis kopieren, können Sie Folgendes eingeben:
cp $$patern + <Tab>
und Autojump würde abgeschlossen
cp /home/user/CompliCatedDireCTOry/long/path/bla/bla
und Sie müssten nur hinzufügen, wo Sie die Datei ablegen möchten. Natürlich kann ich den Kommentar von ott verwenden, um ihn einigen spezifischen Befehlen hinzuzufügen, aber wenn jemand eine bessere Idee hat, wäre ich sehr dankbar.
quelle
Antworten:
Sie können dies tun, indem Sie die Standardbindung für TAB (^ i) überschreiben. Zuerst müssen Sie die TAB-Bindung überschreiben, dann müssen Sie eine Funktion erstellen, die Ihren Befehl aufruft. Zuletzt müssen Sie die Ausgabe dieses Befehls übernehmen und die Variable aktualisieren, die die aktuelle Befehlszeile enthält.
Diese Funktion übernimmt die aktuelle Befehlszeile und ändert die letzten beiden Zeichen in 'huugs'.
In Ihrem Beispiel möchten Sie wahrscheinlich die Zeile new_argument so ändern, dass sie folgendermaßen aussieht:
Überschreiben Sie nun die ^ i-Bindung:
Testen Sie jetzt, ob es funktioniert:
Damit die normale Fertigstellung weiterhin funktioniert, können Sie den $$ -Teil testen, indem Sie cd $$ ... usw. ausführen
Wenn Sie auf Probleme stoßen, aktivieren Sie den ausführlichen Modus:
Es wird alles ausgedruckt, was die Funktion tut.
Ich habe dies unter Ubuntu 11 mit bash 4.2.8 (1) -release (Standardeinstellung) getestet.
quelle
Die Bash-Abschlussroutine kann als Shell-Skript programmiert werden.
Hier ist ein Beispiel für ein Shell-Skript, das in jedem Parameter
$$[Tab]
durch ersetzt wirdmy replacement string
, jedoch nur für den spezifischen Befehlmycommand
und nur, wenn der Parameter genau "$$" ist:Sie müssen das Skript als Quelle
source <file-name>
(oder den Punktbefehl) verwenden, um es zu starten, und dann:Fügen Sie dies in eine der Bash-Profilroutinen ein, damit es für einige oder alle Benutzer immer funktioniert .
Das Problem mit dem
complete
Befehl ist, dass er nur für einen oder mehrere Namen von Befehlen funktioniert, die als Parameter angegeben werden. Man könnte ihm einfach die Liste aller Befehle geben, die möglicherweise von den Benutzern verwendet werden könnten, oder in verzweifelten Fällen erweitern/bin/* /usr/bin/* ~/bin/*
.Getestet unter CentOS 5.5.
Dieses einfache Skript basiert auf den Quellen, die ich in meiner anderen Antwort aufgeführt habe - derjenigen, die vom Moderator studiohack gelöscht wurde. Wenn Sie interessiert sind, bitten Sie ihn einfach, es wiederherzustellen.
quelle