2 votes

Aide pour la complétion de Bash script

Je commence donc à apprendre les scripts de complétion bash, et j'ai commencé à travailler sur un pour un outil que j'utilise tout le temps. Tout d'abord, j'ai construit le scripts en utilisant une liste d'options définie :

_zf_comp() 
{
    local cur prev actions
    COMPREPLY=()
    cur="${COMP_WORDS[COMP_CWORD]}"
    prev="${COMP_WORDS[COMP_CWORD-1]}"

    actions="change configure create disable enable show"

    COMPREPLY=($(compgen -W "${actions}" -- ${cur}))  
    return 0
}
complete -F _zf_comp zf

Cela fonctionne bien. Ensuite, j'ai décidé de créer dynamiquement la liste des actions disponibles. J'ai mis en place la commande suivante :

zf | grep "Providers and their actions:" -A 100 | grep -P "^\s*\033\[36m\s*zf" | awk '{gsub(/[[:space:]]*/, "", $3); print $3}' | sort | uniq | awk '{sub("\-", "\\-", $1); print $1}' | tr \\n " " | sed 's/^ *\(.*\) *$/\1/'

Qui fait essentiellement ce qui suit :

  • Saisit tout le texte de la commande "zf" après "Les fournisseurs et leurs actions :".
  • Saisit toutes les lignes qui commencent par "zf" (j'ai dû faire un peu d'imagination ici parce que la commande ZF imprime en couleur).
  • Prenez la deuxième partie de la commande et supprimez tous les espaces (la partie espaces n'est probablement plus nécessaire).
  • Trier la liste
  • Débarrassez-vous de tous les doublons
  • Tirets d'échappement (j'ai ajouté ceci en essayant de déboguer le problème - probablement pas nécessaire)
  • Coupez toutes les nouvelles lignes
  • Supprimez tous les espaces de début et de fin

La commande ci-dessus produit :

$ zf | grep "Providers and their actions:" -A 100 | grep -P "^\s*\033\[36m\s*zf" | awk '{gsub(/[[:space:]]*/, "", $3); print $3}' | sort | uniq | awk '{sub("\-", "\\-", $1); print $1}' | tr \\n " " | sed 's/^ *\(.*\) *$/\1/'
change configure create disable enable show 
$

Il me semble donc qu'il produit exactement la même chaîne que celle que j'avais dans mon script original. Mais quand je le fais :

_zf_comp() 
{
    local cur prev actions
    COMPREPLY=()
    cur="${COMP_WORDS[COMP_CWORD]}"
    prev="${COMP_WORDS[COMP_CWORD-1]}"

    actions=`zf | grep "Providers and their actions:" -A 100 | grep -P "^\s*\033\[36m\s*zf" | awk '{gsub(/[[:space:]]*/, "", $3); print $3}' | sort | uniq | awk '{sub("\-", "\\-", $1); print $1}' | tr \\n " " | sed 's/^ *\(.*\) *$/\1/'`

    COMPREPLY=($(compgen -W "${actions}" -- ${cur}))  
    return 0
}
complete -F _zf_comp zf

Mon autocomplétion commence à faire des siennes. Tout d'abord, il n'autocomplète rien qui contienne un "n", et ensuite, lorsqu'il autocomplète ("zf create" par exemple), il ne me laisse pas revenir en arrière sur la commande terminée.

La première question qui me laisse complètement perplexe. Pour le second, je pense qu'il s'agit des caractères d'échappement du texte coloré.

Des idées ? Cela me rend fou !

2voto

jason saldo Points 5036

Une chose que je trouve utile est de créer une fonction de débogage qui sort sur un autre terminal :

debug() { echo "$@" >/dev/pts/0; }; export -f de

Vous pouvez alors l'appeler à partir de votre fonction d'achèvement avec le contenu des variables, etc., et il n'interférera pas avec sa propre sortie pendant que vous le testez.

Vous pouvez essayer de changer votre tr d'utiliser des guillemets et voir si cela résout votre problème de "n" :

tr '\n' ' '

Transmettez la sortie de votre grep par le biais de cat -v pour voir s'il manque des séquences d'échappement.

En outre, cela peut accélérer les choses si vous pouvez éviter d'appeler autant de commandes externes.

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X