【发布时间】:2019-10-11 02:47:54
【问题描述】:
为了获得用户的[Y/N] 决定,我使用了一个“yesno”函数,其中包含一个循环:
answer=$( while ! head -c 1 | grep -i '[ny]' ; do true ; done )
但是,这个循环阻塞了一个控制台,并且无法通过按 Ctrl + C 或 Ctrl + Z kbd>。添加类似[\x03](ascii for Ctrl + C )或[\x1A](ascii for Ctrl + Z ) 也无济于事。如何在不依赖其他工具的情况下添加此功能,同时保持 POSIX 兼容性?
#!/bin/sh
yesno () {
printf "$1 [Y/N] "
old_stty_cfg=$( stty -g )
stty raw -echo
answer=$( while ! head -c 1 | grep -i '[ny]' ; do true ; done )
stty "$old_stty_cfg"
if printf "$answer" | grep -iq "^y" ; then
return 0
else
return 1
fi
}
if yesno "Question?" ; then
printf "yes\n"
return 0
else
printf "no\n"
return 1
fi
【问题讨论】:
-
我不确定我是否理解,你为什么不用
read? -
@BenjaminW。这是较大脚本的一部分,它没有在任何地方使用
read/awk,我不知道它们的某些实现是否在某些系统上的工作方式不同 - 所以我希望添加 Ctrl+C / Ctrl+Z 依赖已经使用过的head/grep/printf -
read是一个特殊的内置函数,因此您无需担心每个操作系统的实现,只需担心 POSIX 是否保证 shell 将提供您需要的最少功能。跨度>