Comment puis-je vider le tampon d'entrée dans un script expect?
Question
J'écris un script Attendez-vous et je avoir du mal à faire face à l'invite du shell (sous Linux). Mon Attendez-vous de script engendre rlogin
et le système distant utilise ksh
. L'invite sur le système distant contient le répertoire courant suivi par " > "
(espace supérieur à l'espace). Un extrait de script pourrait être:
send "some command here\r"
expect " > "
Cela fonctionne pour des commandes simples, mais les choses commencent à mal tourner lorsque la commande que je envoie dépasse la largeur du terminal (ou plus précisément, ce que pense ksh
est la largeur du terminal). Dans ce cas, ksh
fait un peu bizarre défilement horizontal de la ligne de commande interactive qui semble réécrire l'invite et tenir un supplément « > » dans la sortie. Naturellement, cela provoque le script expect à se confondre et désynchronisés quand il semble y avoir plus d'une invite à la sortie après l'exécution d'une commande (mon script contient plusieurs paires send
/ de expect
).
Je l'ai essayé de changer PS1
sur le système distant à quelque chose de plus distinctif comme « prompt> » mais un problème similaire se pose qui me indique ce n'est pas la bonne façon de résoudre ce problème.
Qu'est-ce que je pense de l'aide pourrait est la possibilité pour le script à dire attendre à ce que « Je sais que je suis bien synchronisé avec le système distant à ce point, donc vider la mémoire tampon d'entrée maintenant. » La déclaration de expect
a le drapeau -notransfer
qui ne pas Rejeter le tampon d'entrée, même si le motif correspond, donc je pense que je dois à l'opposé de cela.
Y at-il d'autres techniques utiles que je peux utiliser pour faire la coquille à distance se comporter de manière plus prévisible? Je comprends que Expect passe par beaucoup de travail à faire en sorte que la session donné naissance à apparaît pour être interactif au système distant, mais je préfère que quelques-unes des fonctionnalités interactives plus ennuyeux (comme le défilement horizontal de ksh
) est désactivée.
Autres conseils
Vous pouvez essayer "set -o multiligne" ou columns = 1000000 (ou une autre valeur suffisamment grande).
J'ai eu des difficultés avec ksh et attendre dans le passé. Ma solution était d'utiliser autre chose que ksh pour une coquille de connexion.
Si vous pouvez modifier la connexion à distance autre que ksh (en utilisant la commande chsh ou de montage / etc / passwd) alors vous pouvez essayer cela avec / bin / sh comme shell.
Une autre alternative consiste à dire KSH que le terminal est un terminal muet - désavouer de faire tout traitement spécial.
$ export TERM=""
pourrait faire l'affaire.