3 votes

Entrée utilisateur avec délai d'attente

J'utilise un script pour gérer des choses sur des plongées externes. A la fin, je veux donner à l'utilisateur la possibilité de quitter ou de démonter les lecteurs. J'aimerais ajouter un délai d'attente et utiliser la deuxième option (ne rien faire) si l'utilisateur n'a pas répondu.

Je suis assez novice en matière de Linux et les références que j'ai trouvées jusqu'à présent sont beaucoup trop cryptiques pour mon niveau actuel de connaissance de Linux. Il semble que les auteurs des références partent du principe que tout le monde maîtrise déjà Linux :)

Comment ajouter un délai d'attente ou une meilleure façon de procéder avec un délai d'attente et une action par défaut ?

note : "myDrives" est mon propre programme pour gérer la fermeture des fichiers, etc. et le démontage.

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

3voto

steeldriver Points 118154

Voici une façon de le faire, en utilisant la fonction -t timeout de l'option 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

Voir help read à partir de l'invite bash, ou man bash .

2voto

Sergiy Kolodyazhnyy Points 97292

Voici une autre façon de procéder :

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

Points clés à noter :

  • timeout nécessite un processus réel, et non une commande Shell. Ici, nous créons bash Shell en tant que processus séparé et le laisser faire le travail de conduite de la select .
  • printf est utilisé en dehors de timeout pour éviter d'envoyer son texte par le tuyau
  • while read -r answer; do . . .done fonctionnera si et seulement si elle a reçu quelque chose par le biais du tuyau. Ainsi, si le précédent bash le processus a expiré, il ne s'exécutera pas - il y a votre action par défaut qui consiste à ne rien faire.
  • si le while a reçu quelque chose par l'intermédiaire d'un tuyau, il vérifiera s'il s'agit de l'élément yes réponse, sinon - il ne fera rien

1voto

Chris Points 111

Vous pouvez utiliser TMOUT variable qui est considérée par select :

echo "Do you want to un-Mount the External Drives?"
TMOUT=10 # 10 seconds time-out
select yn in "yes" "no"; do
  case $yn in
    "yes" ) echo "unmount" ;;
    "no" ) echo "don't unmount" ;;
  esac
  break;
done
if [ -z "$yn" ] ; then
  echo "default action"
fi

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X