Ввод пользователя с тайм-аутом

Попробуйте ctrl + Shift + V для вставки текста (который скопирован из внешних источников) в gnome-terminal.

2
задан 8 June 2017 в 18:53

6 ответов

Вот один из способов сделать это, используя опцию -t timeout bash read builtin:

#!/bin/bash

while :
do
  read -t10 -p "Do you want to un-Mount the External Drives? (Y/N): "
  if [ $? -gt 128 ]; then
    echo "timed out waiting for user response"
    break
  fi

  case $REPLY in
  [yY]*)
    echo "do it"
    break
    ;;
  [nN]*)
    echo "don't do it"
    break
    ;;
  *) echo "Please enter Y or N"
     ;;
  esac
done

См. help read из приглашения bash или man bash.

2
ответ дан 22 May 2018 в 21:45
  • 1
    Спасибо, это более просто для меня понять на моем текущем уровне Linux. Но тогда мне все равно нравится, всегда легче читать и понимать несколько месяцев спустя. – X10WannaBe 8 June 2017 в 20:59

Вот один из способов сделать это, используя опцию -t timeout bash read builtin:

#!/bin/bash while : do read -t10 -p "Do you want to un-Mount the External Drives? (Y/N): " if [ $? -gt 128 ]; then echo "timed out waiting for user response" break fi case $REPLY in [yY]*) echo "do it" break ;; [nN]*) echo "don't do it" break ;; *) echo "Please enter Y or N" ;; esac done

См. help read из приглашения bash или man bash.

2
ответ дан 18 July 2018 в 11:58

Вот один из способов сделать это, используя опцию -t timeout bash read builtin:

#!/bin/bash while : do read -t10 -p "Do you want to un-Mount the External Drives? (Y/N): " if [ $? -gt 128 ]; then echo "timed out waiting for user response" break fi case $REPLY in [yY]*) echo "do it" break ;; [nN]*) echo "don't do it" break ;; *) echo "Please enter Y or N" ;; esac done

См. help read из приглашения bash или man bash.

2
ответ дан 24 July 2018 в 19:53

Вот еще один способ сделать это:

#!/bin/bash

printf "%s\n" "Do you want to un-Mount the External Drives?" 
timeout --foreground 10 bash -c '
    select sel in "yes" "no"
    do
        echo "$REPLY"
        break
    done' | while read -r answer; do
        echo ">>Got from user: $answer"
        case "$answer" in
            "yes") echo "Unmounting stuff" ;;
        esac
done

Ключевые моменты:

timeout требует действительного процесса, а не команды оболочки. Здесь мы создаем оболочку bash как отдельный процесс и позволяем ему выполнять работу по вождению select. printf используется вне timeout, чтобы избежать отправки его текста через канал while read -r answer; do . . .done, будет работать тогда и только тогда, когда он получил что-то через канал. Таким образом, если предыдущий bash процесс истечет, он не будет работать - есть действие по умолчанию, которое вы ничего не делаете. если цикл while получил что-то через канал, он проверяет, является ли это ответом yes, иначе - он ничего не сделает
1
ответ дан 22 May 2018 в 21:45
  • 1
    Спасибо, но я предпочитаю вариант, который дал SteelDriver. Я ценю, что вы нашли время, чтобы описать, что происходит. – X10WannaBe 8 June 2017 в 21:01

Вот еще один способ сделать это:

#!/bin/bash printf "%s\n" "Do you want to un-Mount the External Drives?" timeout --foreground 10 bash -c ' select sel in "yes" "no" do echo "$REPLY" break done' | while read -r answer; do echo ">>Got from user: $answer" case "$answer" in "yes") echo "Unmounting stuff" ;; esac done

Ключевые моменты:

timeout требует действительного процесса, а не команды оболочки. Здесь мы создаем оболочку bash как отдельный процесс и позволяем ему выполнять работу по вождению select. printf используется вне timeout, чтобы избежать отправки его текста через канал while read -r answer; do . . .done, будет работать тогда и только тогда, когда он получил что-то через канал. Таким образом, если предыдущий bash процесс истечет, он не будет работать - есть действие по умолчанию, которое вы ничего не делаете. если цикл while получил что-то через канал, он проверяет, является ли это ответом yes, иначе - он ничего не сделает
1
ответ дан 18 July 2018 в 11:58

Вот еще один способ сделать это:

#!/bin/bash printf "%s\n" "Do you want to un-Mount the External Drives?" timeout --foreground 10 bash -c ' select sel in "yes" "no" do echo "$REPLY" break done' | while read -r answer; do echo ">>Got from user: $answer" case "$answer" in "yes") echo "Unmounting stuff" ;; esac done

Ключевые моменты:

timeout требует действительного процесса, а не команды оболочки. Здесь мы создаем оболочку bash как отдельный процесс и позволяем ему выполнять работу по вождению select. printf используется вне timeout, чтобы избежать отправки его текста через канал while read -r answer; do . . .done, будет работать тогда и только тогда, когда он получил что-то через канал. Таким образом, если предыдущий bash процесс истечет, он не будет работать - есть действие по умолчанию, которое вы ничего не делаете. если цикл while получил что-то через канал, он проверяет, является ли это ответом yes, иначе - он ничего не сделает
1
ответ дан 24 July 2018 в 19:53
  • 1
    Спасибо, но я предпочитаю вариант, который дал SteelDriver. Я ценю, что вы нашли время, чтобы описать, что происходит. – X10WannaBe 8 June 2017 в 21:01

Другие вопросы по тегам:

Похожие вопросы: