首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >POSIX替代bash读取,具有超时和字符限制

POSIX替代bash读取,具有超时和字符限制
EN

Stack Overflow用户
提问于 2015-08-25 20:47:59
回答 2查看 2K关注 0票数 2

我正在编写一个交互式shell脚本,需要在尽可能多的系统上运行。是否有一种与标准POSIX系统兼容的实现以下功能的替代方法?

代码语言:javascript
运行
复制
#! /bin/bash
echo -n "Do you wish to continue? (Y/n) 5 seconds to respond... "
read -n 1 -t 5 answer # accepts a single character, 5 second timeout.
if [ "$answer" = "n" ] || [ "$answer" = "N" ] ; then
  echo -e "\nExiting..."
  exit
fi
echo -e "\nContinuing with script..."
# More code

read上的超时对我来说是最重要的(read -t 5)。读取的一个字符限制是可取的,但不是必需的(read -n 1)。理想情况下,脚本可以在POSIX系统上工作,也可以在bash中工作,而不必启用特殊的POSIX兼容模式。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-08-28 11:35:36

根据迪基的回答,以下内容似乎奏效了,如果按下“n”或“N”以外的任何内容,则继续使用脚本。

据我所知,所有的标准设置都是posix。

代码语言:javascript
运行
复制
#!/bin/sh

read_char() {
        old=$(stty -g)
        stty raw -echo min 0 time 50
        eval "$1=\$(dd bs=1 count=1 2>/dev/null)"
        stty $old
}

printf "Do you wish to continue? (Y/n) 5 seconds to respond..."
read_char answer
# answer=$(getch)
# answer=$(getche)

if [ "$answer" = "n" ] || [ "$answer" = "N" ] ; then
  printf "\nExiting...\n"
  exit
fi

printf "\nContinuing with script...\n"

替代"read_char":

这避免了使用eval (可能是不安全的)。

代码语言:javascript
运行
复制
getch() {
        old=$(stty -g)
        stty raw -echo min 0 time 50
        printf '%s' $(dd bs=1 count=1 2>/dev/null)
        stty $old
}

这样就避免了eval并打印按下的键。

代码语言:javascript
运行
复制
getche() {
        old=$(stty -g)
        stty raw min 0 time 50
        printf '%s' $(dd bs=1 count=1 2>/dev/null)
        stty $old
}
票数 4
EN

Stack Overflow用户

发布于 2015-08-25 23:56:31

stty程序提供了这样做的方法。xterm有几个脚本(在其源代码的“vttest”子目录中),它们保存、修改和恢复终端设置,以允许它读取终端的响应以转义序列。下面是dynamic2.sh的一部分(开始设置printfecho,以使用$CMD变量来解决一些旧系统):

代码语言:javascript
运行
复制
echo "reading current color settings"

exec </dev/tty
old=`stty -g`
stty raw -echo min 0  time 5

original=
for N in $FULL
do
    $CMD $OPT "${ESC}]$N;?^G${SUF}" > /dev/tty
    read reply
    eval original$N='${reply}${SUF}'
    original=${original}${reply}${SUF}
done
stty $old

if ( trap "echo exit" EXIT 2>/dev/null ) >/dev/null
then
    trap '$CMD $OPT "$original" >/dev/tty; exit' EXIT HUP INT TRAP TERM
else
    trap '$CMD $OPT "$original" >/dev/tty; exit' 0    1   2   5    15
fi
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32213758

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档