Grundsätzlich gibt es keine Möglichkeit, die von Ihnen beschriebenen Probleme zu beheben, da bash die Werte COMPREPLYdirekt in der Anzeige verwendet und dann den Text des Benutzers ersetzt. Um das zu erhalten, was Sie möchten, müssen Sie zunächst die möglichen Vervollständigungen (nur die zusätzlichen) generieren Servernamen (ohne Präfix), damit die Bash angezeigt wird. Wenn die Bash den Benutzertext durch die längste nicht in Konflikt stehende Zeichenfolge ersetzen soll, muss das Skript erneut aufgerufen werden, um den Text mit dem Präfix und der Bash zu generieren hat keine möglichkeit dafür.
Das Beste, was ich mir einfallen lassen könnte, ist, dass COMPREPLYnur das erste Wort mit dem gesamten Präfix ( COMPREPLY=( "${prefix},"$(compgen -W "${servers[@]}" -- ${realcur}) )) generiert wird. Wenn es also nur eine mögliche Vervollständigung gibt, wird sie automatisch korrekt vervollständigt, und wenn es mehr als eine mögliche Vervollständigung gibt , dann entfernt bash nicht, was bisher eingegeben wurde (da das erste Wort COMPREPLYdas gesamte Präfix enthält und somit mit dem aktuell eingegebenen Text übereinstimmt und durch bash ausgewählt wird, um den Text des Benutzers zu ersetzen) und zeigt die Optionen ohne das Präfix an - außer Für dieses eine Wort, das bereits das Präfix enthält, sieht die Ausgabe folgendermaßen aus:
$ command -s banana,a
ananas apricot banana,apple
"apple" als letztes in den Vervollständigungsoptionen sortiert, da es das Präfix trägt, das mit "b" beginnt - sehr verwirrend. Deshalb empfehle ich das nicht.
In Bezug auf die Duplikate - um keine Duplikate anzuzeigen, müssen Sie nur $prefixin ihren Teil einbrechen (easy IFS="," prefix_parts=($prefix):) und dann darüber iterieren und nur $serversdie Namen belassen , die noch nicht aufgeführt sind. Es ist mühsam zu tippen, deshalb werde ich es hier nicht zeigen, aber relativ trivial, also bin ich sicher, dass du es schaffen kannst :-).
Zusammenfassend sollte ich nicht sagen, dass Sie kommagetrennte Werte für die Eingabeoptionen verwenden sollten, zumindest wenn Sie erwarten, dass bash Ihnen beim Abschluss hilft.
Sie können ein Optionsformat wie das folgende unterstützen: Wenn Sie command -s <server> [<server> [..]]andere als die unmittelbar nach der -sOption angegebenen Einträge vervollständigen möchten, durchsuchen Sie das $COMP_WORDSArray einfach von $COMP_CWORDbis Sie eine Option (Zeichenfolge, die übereinstimmt -*) finden und wenn "-s", dann Sie müssen den Servernamen vervollständigen.
IFS=, LIST=("$VARIABLE")wobei $ VARIABLE Ihre kommagetrennten Werte enthält.