Comment puis-je vider le tampon d'entrée dans un script expect?
Je suis en train d'écrire un script expect et éprouve de la difficulté à composer avec l'invite du shell (Linux). Mon script expect engendre rlogin
et le système distant à l'aide de ksh
. L'invite sur le système distant contient le répertoire en cours, suivi par " > "
(espace plus grand que l'espace). Un extrait de script peut être:
send "some command here\r"
expect " > "
Cela fonctionne pour les commandes simples, mais les choses commencent à aller mal lors de la commande je suis l'envoi dépasse la largeur de la borne (ou plus précisément, qu' ksh
pense est la largeur de la borne). Dans ce cas, ksh
fait un peu bizarre de défilement horizontal de l'interactif en ligne de commande, ce qui semble à la réécriture de la rapidité et de coller un extra "> " dans la sortie. Naturellement, cela provoque le script expect de se confondre et de synchronisation quand il semble y avoir plus d'une invite dans la sortie après l'exécution d'une commande (mon script contient plusieurs send
/expect
paires).
J'ai essayé de changer PS1
sur le système distant à quelque chose de plus distinctifs comme l'invite "> " mais un problème similaire se pose qui m'indique que la n'est pas la bonne façon de résoudre ce problème.
Ce que je pense, pourrait aider, c'est la capacité pour le script de dire s'Attendre à ce que "je sais que je suis correctement synchronisé avec le système à distance à ce point, afin de vider le tampon d'entrée maintenant." Le expect
instruction a -notransfer
drapeau qui n'est pas jetez le tampon d'entrée, même si le modèle ne correspond pas, donc je pense que j'ai besoin de tout le contraire.
Existe-il d'autres techniques utiles que je peux utiliser pour faire le shell distant se comporter de façon plus prévisible? Je comprends que s'Attendre à passe par beaucoup de travail pour s'assurer que le pondu session apparaît être interactif sur le système distant, mais je préfèrerais que quelques-uns des plus ennuyeux des fonctionnalités interactives (comme le défilement horizontal de ksh
) être désactivée.
OriginalL'auteur Greg Hewgill | 2009-12-09
Vous devez vous connecter pour publier un commentaire.
Si vous voulez jeter toutes les sorties s'Attendre a vu jusqu'à présent, essayez de
C'est une regexp match sur $ ce qui signifie la fin de la mémoire tampon d'entrée, donc il vous suffit de sauter tout reçu jusqu'à présent. Plus de détails à la Attendre l'homme page.
OriginalL'auteur Colin Macleod
Vous pouvez essayer de "set-o multiline" ou de COLONNES=1000000 (ou une autre assez grande valeur).
ksh
sur ce système ne semble pas avoir lamultiline
option, mais j'ai découvert que si jeset +o emacs
(désactivation de la emacs édition de la ligne de l'option, qui semble être la valeur par défaut), puis le défilement horizontal est également désactivée.OriginalL'auteur Andru Luvisi
J'ai eu de la difficulté avec ksh et Attendre dans le passé. Ma solution a été d'utiliser autre chose que
ksh pour un shell de connexion.
Si vous pouvez changer la connexion à distance à un autre que ksh (à l'aide de la commande chsh ou de l'édition de /etc/passwd), alors vous pouvez aussi essayer avec /bin/sh en tant que shell.
Une autre alternative est de dire KSH que le terminal est un terminal passif - interdire de faire de tout traitement spécial.
pourrait faire l'affaire.
TERM
, c'est une bonne idée.OriginalL'auteur Philip Schlump