【发布时间】:2023-03-28 22:03:01
【问题描述】:
如何在ksh 和退出后捕捉 CTRL+D 键盘?
while true; do
read cmd
echo $cmd
if [ "$cmd" = "?????" ]; then
break
fi
done
【问题讨论】:
如何在ksh 和退出后捕捉 CTRL+D 键盘?
while true; do
read cmd
echo $cmd
if [ "$cmd" = "?????" ]; then
break
fi
done
【问题讨论】:
CTRL-D 是“文件结尾(EOF)”,您需要做的是“捕获”该输入。不幸的是,没有 EOF 字符——当您按下和弦 CTRL-D 时,tty 会向读取应用程序发送一个信号,表明输入流已完成返回一个哨兵值以使其退出。
为了防止这个字符被视为进一步的输入,它必须是一个 特殊 字符(例如,超出范围的东西,如 -1)。当终端检测到这样的字符时,它会缓冲其所有字符,以便输入为空,这反过来使您的程序读取零字节(文件结尾)。
您可能会遇到问题,因为read 命令在收到eof 时退出,因此您的脚本很可能在到达条件之前终止。这具有打破脚本的副作用,但可能不是您想要的方式。
试试:
#!/usr/bin/env ksh
# unmap so we can control the behavior
stty eof ^D
while true; do
read cmd
echo $cmd
# are we out of input? let's get a taco
if [ ! -n "$cmd" ]; then
echo 'taco time'
fi
done
当你得到其他信号(如^C)时,一般形式是:
trap [命令] [要捕获的信号]
【讨论】:
[ ! -n "$cmd" ] 在不输入任何字符的情况下按 ENTER 将不起作用。
只需使用while read:
while read cmd; do
echo $cmd
done
【讨论】:
while read 起作用的原因:当它遇到 eof 时,read 退出非零,并且 while 循环可以退出。