2010-09-24 6 views
3

J'ai besoin d'attendre une entrée pendant 20 secondes, après quoi le script devrait continuer l'exécution.
J'ai essayé d'utiliser read -t20 var mais cela ne fonctionne que sur bash. J'utilise ksh sur Solaris 10.Shell Script (bash/ksh): 20 secondes pour lire une variable

Quelqu'un peut-il m'aider s'il vous plaît?

EDIT: 20 secondes est seulement un exemple. Faisons semblant d'attendre 1 heure. Mais le gars pourrait ou ne pourrait pas être devant le PC pour écrire l'entrée, il n'a pas besoin d'attendre 1 heure pour entrer une entrée, mais s'il n'est pas devant le PC, le shell devrait continuer l'exécution après avoir attendu pour quelques temps.

Merci!

+0

'sommeil 20 $ && lecture {variable}' ?? – Anders

+0

20 secondes est seulement un exemple. Faisons semblant d'attendre 1 heure. Mais le gars est devant le PC pour écrire l'entrée, il n'a pas besoin d'attendre la 1 heure .... l'a eu? – jyz

Répondre

1

Regardez this forum thread il a la réponse dans le troisième post.

+0

Merci mon pote ça a marché. Je me demandais ... puisque nous utilisons ksh, y a-t-il un moyen de le faire avec coproccess? – jyz

+0

Le troisième message a 'read -t' que l'OP ne peut pas utiliser. Si vous ne comptez pas la question sur ce lien, la troisième * réponse * n'est pas une solution. Ce genre de confusion est l'une des raisons pour lesquelles il est préférable que SO inclue l'information du lien dans votre réponse. –

2

De man ksh:

TMOUT
Si elle est définie à une valeur supérieure à zéro, la coquille se termine si une commande n'est pas entré dans le nombre de secondes après l'émission de l'invite PS1. Le shell peut être compilé avec une limite maximale pour cette valeur qui ne peut pas être dépassée.

Je ne suis pas sûr que cela fonctionne avec read dans ksh sur Solaris. Cela fonctionne avec ksh93, mais cette version a également read -t.

This script comprend cette approche:

# Start the (potentially blocking) read process in the background 

    (read -p && print "$REPLY" > "$Tmp") & readpid=$! 

    # Now start a "watchdog" process that will kill the reader after 
    # some time: 

    (
     sleep 2; kill $readpid >/dev/null 2>&1 || 
     { sleep 1; kill -1 $readpid >/dev/null 2>&1; } || 
     { sleep 1; kill -9 $readpid; } 
    ) &  watchdogpid=$! 

    # Now wait for the reading process to terminate. It will terminate 
    # reliably, either because the read terminated, or because the 
    # "watchdog" process made it terminate. 

    wait $readpid 

    # Now stop the watchdog: 

    kill -9 $watchdogpid >/dev/null 2>&1 

    REPLY=TERMINATED   # Assume the worst 
    [[ -s $Tmp ]] && read < "$Tmp" 
+0

TMOUT est destiné aux sessions interactives, d'où il est dit 'après émission de l'invite PS1'. Ca ne fera rien dans un script – Daenyth

+0

@Daenyth: Cela fonctionne dans un script de test que j'ai essayé (mais si ça expire il laisse le terminal dans l'état '-echo' et je dois faire une réinitialisation). –

+0

Wow, c'est terrible – Daenyth

Questions connexes