Entrada do usuário com tempo limite

2

Estou usando um script para gerenciar coisas em mergulhos externos. No final, quero dar ao usuário a opção de sair ou desmontar as unidades. Eu gostaria de adicionar um tempo limite e usar a segunda opção (não fazer nada) se o usuário não respondeu.

Eu sou relativamente novo no Linux e as Referências que encontrei até agora são muito crípticas para o meu nível atual de linux. Parece que os escritores do Reference consideram que todo mundo já é fluente no Linux. :)

Como adiciono um tempo limite a isso ou uma maneira melhor de fazer isso com um tempo limite e uma ação padrão?

nota: "myDrives" é o meu próprio programa para lidar com o fechamento de arquivos etc e desmontar

echo "Do you want to un-Mount the External Drives?"
echo ""
select yn in "yes" "no"; do
  case $yn in
    yes ) sudo myDrives --unmount; 
          break;;
    no ) break;;
  esac
done
kill -9 $PPID
    
por X10WannaBe 08.06.2017 / 17:53

2 respostas

2

Aqui está uma maneira de fazer isso, usando a opção -t timeout do 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

Veja help read no prompt do bash ou man bash .

    
por steeldriver 08.06.2017 / 18:22
1

Aqui está outra maneira de fazer isso:

#!/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

Pontos-chave a serem observados:

  • timeout requer um processo real, não um comando shell. Aqui, geramos bash shell como um processo separado e deixamos que ele execute o trabalho de select .
  • printf é usado fora de timeout para evitar enviar seu texto via pipe
  • while read -r answer; do . . .done irá operar se, e somente se, receber algo via pipe. Assim, se o processo bash anterior expirou, ele não será executado - sua ação padrão é não fazer nada.
  • se o loop while recebeu algo via pipe, ele verificará se é a resposta yes , caso contrário - não fará nada
por Sergiy Kolodyazhnyy 08.06.2017 / 19:12