用户输入超时

用户输入超时

我正在使用脚本来管理外部驱动器上的内容。最后,我想让用户选择离开或卸载驱动器。如果用户没有响应,我想添加超时并使用第二个选项(不执行任何操作)。

我对 Linux 还很陌生,到目前为止我找到的参考资料对于我目前的 Linux 水平来说太过晦涩难懂。参考资料作者似乎认为每个人都已经精通 Linux。:)

如何为此添加超时或使用超时和默认操作来执行此操作的更好方法?

注意:“myDrives”是我自己用来处理文件关闭等操作和卸载的程序

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

答案1

以下是一种实现此目的的方法,使用-t timeoutbashread内置选项:

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

这是另一种方法:

#!/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需要实际的进程,而不是 shell 命令。这里我们将bashshell 生成为单独的进程,并让它执行驱动的工作select
  • printf用于外部timeout以避免通过管道发送其文本
  • while read -r answer; do . . .done当且仅当它通过管道接收到某些内容时才会运行。因此,如果前一个bash进程超时,它将不会运行 - 这是您的默认操作,即不执行任何操作。
  • 如果while循环通过管道接收到某些内容,它将检查它是否是yes答案,否则它将不执行任何操作

答案3

你可以使用输出变量被考虑为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

相关内容