/ / Wie kann ich die Bash-Befehlszeile vervollständigen, um ein Teilargument zu vervollständigen und dann weitere Hinweise zu geben - Linux, Befehlszeile, Bash, Shell, Shell-Skript?

Wie kann ich die Bash-Befehlszeile vervollständigen, um ein Teilargument zu vervollständigen und dann weitere Hinweise zu geben - Linux, Befehlszeile, Bash, Shell, Shell-Skript?

Stellen Sie sich vor, ich habe einen Befehl "Befehl", der dauertArgumente foo: bar foo: foo bar: bar oder bar: foo Ich kann ein Skript zur Vervollständigung der Befehlszeile schreiben, das ich in meine Umgebung einfügen kann, um eine Vervollständigung zu erhalten, die wie folgt aussieht:

function _command_opt()
{
local cur prev opts
COMPREPLY=()
cur="${COMP_WORDS[COMP_CWORD]}"
prev="${COMP_WORDS[COMP_CWORD-1]}"
opts="foo:bar foo:foo bar:bar bar:foo"
if [[ ${prev: -7} == "command" ]]
then
COMPREPLY=( $(compgen -W "${opts}"  -- ${cur}) );
return 0;
fi
}
complete -F _command_opt -o bashdefault -o default "command"

Allerdings wenn ich tippe command f[tab][tab] Ich bekomme foo: bar und foo: foo aufgelistet, aber keines wird auf meiner Kommandozeile ausgefüllt (weil sie noch nicht eindeutig sind. Was ich erreichen möchte, ist, dass dies produziert command foo: und lasse meinen Cursor am Ende des aktuellen Wortes (anstatt ein Leerzeichen hinzuzufügen), damit ich dann tippen kann b oder f und dann erneut die Tabulatortaste, um den Befehl zu beenden. Das Beispielproblem ist nur zu zeigen, was ich meine ... der wahre Fall das Präfix: Suffix-Kombinationen sind ziemlich lang, so dass eine teilweise Vervollständigung wirklich vorteilhaft wäre. z.B. 25 verschiedene Befehle, die alle mit dem Präfix translationupdateprocess beginnen: und translationupdateprocess ist eines von 25 verschiedenen gleich langen Präfixen mit so vielen Optionen.

Kennt jemand eine Möglichkeit, Bash zu vervollständigen, um auf diese Weise zu arbeiten?

Antworten:

0 fĂĽr Antwort â„– 1

Sie können den folgenden Code verwenden (Ich habe Ihre Optionen durch ersetzt foo:baz foo:qux bar:eat bar:egg um zu klären):

function _command_opt()
{
local cur cursec command opts
COMPREPLY=()

cur="${COMP_WORDS[COMP_CWORD]}"
cursec=`echo ${cur} | awk -F ":" "{print $1}"`;

command="${COMP_WORDS[1]}"
opts="foo bar"

case "${command}" in
foo)
COMPREPLY=( $(compgen -W "baz qux" -- ${cursec}) ); return 0;;
bar)
COMPREPLY=( $(compgen -W "eat egg" -- ${cursec}) ); return 0;;
*) ;;
esac

COMPREPLY=( $(compgen -W "${opts}" -S ":" -- ${cur}) ); compopt -o nospace;
}

complete -F _command_opt -o bashdefault -o default "command"

Wenn Sie tippen command [tab] Sie können die Liste der ersten Ebene erhalten foo: bar: und wenn Sie tippen f[tab][tab] Sie erhalten die Abschlussliste für die zweite Ebene baz qux. Dann können Sie eingeben q[tab] um die volle Kommandozeile zu bekommen command foo:qux.

Ich hoffe es hilft.