我正在使用脚本来管理外部驱动器上的内容。最后,我想让用户选择离开或卸载驱动器。如果用户没有响应,我想添加超时并使用第二个选项(不执行任何操作)。
我对 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 timeout
bashread
内置选项:
#!/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 命令。这里我们将bash
shell 生成为单独的进程,并让它执行驱动的工作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