2014-07-04 10 views
5

Voglio "ascoltare" una stringa emessa dalla shell, mentre è in modalità "Interagisci". O voglio in qualche modo emulare la modalità interattiva, che mi consente ancora di ascoltare una stringa specifica dalla shell.Aspettarsi - Aspettare mentre si interagisce

Sembra che interact ascolti solo gli input dell'utente (i tasti premuti) e non quello restituito dalla shell.

Come farei se Aspetto di eseguire qualcosa ogni volta che vede una stringa specifica, ma altrimenti permettimi di usare la shell in modo interattivo senza ostacoli ?.

Esempio:

proc yay {} { 
     send_user "Yay\n" 
} 

trap { # trap sigwinch and pass it to the child we spawned 
    set rows [stty rows] 
    set cols [stty columns] 
    stty rows $rows columns $cols < $spawn_out(slave,name) 
} WINCH 

spawn bash 

interact { 
    interact -re "HOT" { 
     yay 
    } 

    expect { 
     fuzz yay 
    } 

} 

se corro questo e digitare "HOT" risponde con "Yay". Come previsto, legge le mie chiavi. Ma se digito

echo fuzz 

La clausola "expect" non viene attivata. Anche "echo HOT" non innescherà nulla.

Quindi è possibile o mi manca qualcosa. Forse avrei bisogno di emulare interact in una sorta di "expect, continue" -loop. È solo importante che tutto funzioni normalmente nella shell ..

Suggerimenti qualcuno?

risposta

4

È possibile utilizzare il comando expect_background. Da man page:

accetta gli stessi argomenti previsti, tuttavia restituisce immediatamente. I pattern vengono testati ogni volta che arriva un nuovo input.

È possibile modificare lo script iniziale in questo modo:

#!/usr/bin/expect 

proc yay {} { 
send_user "Yay\n" 
} 

trap { # trap sigwinch and pass it to the child we spawned 
    set rows [stty rows] 
    set cols [stty columns] 
    stty rows $rows columns $cols < $spawn_out(slave,name) 
} WINCH 

spawn bash 

expect_background { 
fuzz yay 
} 
interact -re "HOT" { 
    yay 
}