Ein bisschen Kontext, diese Frage ist eine Fortsetzung dieser Frage: Bash Remote Autocompletion: Ändern Sie das 'Start'-Verzeichnis
Wie auch immer, ich schreibe mein benutzerdefiniertes Bash-Skript für die automatische Vervollständigung: Ich möchte, dass die automatische Vervollständigung genauso cd
funktioniert wie sie, außer dass ich die Namen aus einem bestimmten Verzeichnis abrufen möchte, nicht unbedingt aus dem aktuellen. Es funktioniert hervorragend, außer wenn Dateinamen Leerzeichen enthalten.
Ein kurzes Beispiel. Angenommen, das Verzeichnis, aus dem ich die Namen erhalte, enthält zwei Dateien: a_file
und another file
(beachten Sie das Leerzeichen). Das passiert:
my_command
TABTAB
a_file
file
another
Die Präsentation ist nicht perfekt, aber die Idee ist, dass ich mit 3 Auswahlmöglichkeiten aufgefordert werde, another file
aufgeteilt in another
und file
. Die gewünschte Ausgabe wäre :
file_1
another file
. Ich möchte auch, dass Leerzeichen automatisch maskiert werden:
my_command ano
TAB
my_command another\ file
So sieht mein Skript aus:
#! / bin / bash _get_file_list () { dir = "/ some / path /" cd $ dir find * -maxdepth 0 }} _GetOptMyCommand () { lokale cur COMPREPLY = () cur = $ {COMP_WORDS [COMP_CWORD]} Fall "$ cur" in - *) COMPREPLY = ($ (compgen -W "-h -l --help --list -" - "$ cur")) ;; *) COMPREPLY = ($ (compgen -W "$ (_ get_file_list)" - "$ cur")) ;; esac 0 zurückgeben }} complete -F _GetOptMyCommand my_command
Wie gehe ich mit Leerzeichen in Dateinamen um und mache mein Autocompletion-Skript so cd
?
quelle
local IFS=$'\n'
scheint das zu sein, wonach Sie suchen. Das hat bei mir funktioniert.Antworten:
Glauben Sie, es könnte besser sein,
compgen
alsfind
in diesem Fall zu verwenden.Sie haben wahrscheinlich bereits ein Abschlussskript mit System. Versuchen Sie zB
Bei Debian-Varianten ist dies wahrscheinlich:
wo Sie zB finden
_filedir
. Der einfachste Weg wäre also etwas in Richtung:Wenn dies keine Option ist, könnte dies ein Starter sein:
Eine Variante mit
find
könnte etwas in diese Richtung sein:Beachten Sie auch, dass
printf
in Bash eine%q
Option hat. Um Zeichenfolgen in Anführungszeichen zu generieren, können Sie mit folgenden Optionen spielen:Auch nicht, dass Dateinamen Zeilenumbrüche enthalten können, in denen ein Großteil davon unterbrochen wird. Haben Sie nicht einen Weg zu benutzen gefunden
\0
mitcompgen
.quelle
completions/
) Unterverzeichnis, in dem Sie sichbash_completion
befinden, nach befehlsspezifischen Abschlussskripten. Es sollte eine ziemlich lange nette Liste mit Skripten geben.compgen
kann aber auch auf Ihrem SSH-Server verwendet werden.Ich bin kürzlich auf dasselbe Problem gestoßen. Ich konnte die Dinge richtig funktionieren lassen, indem ich die IFS-Variable mit
local IFS=$'\n'
und dann mit Arrays änderte . Versuchen Sie Folgendes:quelle
Versuchen Sie, den
find
Ausgang durchzuleitensed 's/ /\\ /'
.Beachten Sie jedoch, dass andere Zeichen (Anführungszeichen, $, & .. alle üblichen Verdächtigen) Sie ebenfalls stolpern können.
kann besser sein, da es den meisten "Sonderzeichen" entgeht.
(Ich habe jedoch noch nicht herausgefunden, wie ich richtig entkommen kann)
quelle
another\ file
) richtig formatiert . Das Problem liegt wahrscheinlich danach,compgen -W "$(_get_file_list)"
weil ich immer noch mit den drei Auswahlmöglichkeiten aufgefordert werdefile
,another
unda_file
.