Sto scrivendo uno script Expect e sto avendo problemi a gestire il prompt della shell (su Linux). Lo script My Expect spawn rlogin
e il sistema remoto utilizza ksh
. Il prompt sul sistema remoto contiene la directory corrente seguita da " > "
(spazio maggiore di spazio). Un frammento di script potrebbe essere:Come posso svuotare il buffer di input in uno script previsto?
send "some command here\r"
expect " > "
Questo funziona per i comandi semplici, ma le cose cominciano ad andare male quando il comando sto inviando supera la larghezza del terminale (o più precisamente, che cosa pensa ksh
è la larghezza di il terminale). In tal caso, lo ksh
esegue uno strano scorrimento orizzontale della riga di comando interattiva, che sembra riscrivere il prompt e inserire un ulteriore ">" nell'output. Naturalmente questo fa sì che lo script Expect venga confuso e fuori sincrono quando sembra che ci sia più di un prompt nell'output dopo l'esecuzione di un comando (il mio script contiene diverse coppie send
/expect
).
Ho provato a cambiare PS1
sul sistema remoto a qualcosa di più distintivo come "prompt>" ma sorge un problema simile che mi indica che non è il modo giusto per risolvere questo problema.
Quello che sto pensando potrebbe essere la possibilità per lo script di dire a Expect che "so che sono sincronizzato correttamente con il sistema remoto a questo punto, quindi svuota il buffer di input ora." L'istruzione expect
ha il flag -notransfer
che non invia scartando il buffer di input anche se il pattern corrisponde, quindi penso di aver bisogno del contrario.
Esistono altre tecniche utili che è possibile utilizzare per rendere il comportamento della shell remota più prevedibile? Comprendo che Expect passa attraverso un sacco di lavoro per assicurarsi che la sessione generata compaia per essere interattiva al sistema remoto, ma preferirei che alcune delle più interessanti funzionalità interattive (come lo scorrimento orizzontale di ksh
) essere spento.
Eccellente, sembra essere proprio quello di cui avevo bisogno. –