Shell Script (bash / ksh): 20 секунд для чтения переменной - PullRequest
3 голосов
/ 24 сентября 2010

Мне нужно подождать ввода в течение 20 секунд, после этого myscript должен продолжить выполнение.
Я пытался использовать read -t20 var, однако это работает только на bash.Я использую ksh в Solaris 10.

Может кто-нибудь мне помочь, пожалуйста?

EDIT : 20 секунд - это только пример.Давайте представим, что нужно подождать 1 час.Но парень может или не может быть перед ПК, чтобы записать ввод, ему не нужно ждать 1 час, чтобы ввести ввод, но если он не перед ПК, поэтому оболочка должна продолжить выполнение после ожиданияв течение некоторого времени.

Спасибо!

Ответы [ 2 ]

2 голосов
/ 24 сентября 2010

С man ksh:

TMOUT
Если установлено значение больше нуля, оболочка завершает свою работу, если команда не введена в пределах предписанного числасекунд после выдачи приглашения PS1.Оболочка может быть скомпилирована с максимальным ограничением для этого значения, которое не может быть превышено.

Я не уверен, работает ли это с read в ksh в Solaris.Он работает с ksh93, но эта версия также имеет read -t.

Этот скрипт включает в себя этот подход:

# 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"
1 голос
/ 24 сентября 2010

Посмотрите на эту ветку форума , в которой есть ответ в третьем сообщении.

...