如何在ksh
和退出后抓住 CTRL + D 键盘?
while true; do
read cmd
echo $cmd
if [ "$cmd" = "?????" ]; then
break
fi
done
答案 0 :(得分:6)
CTRL - D 是“文件结束(EOF)”,您需要做的是“陷阱”该输入。不幸的是,没有EOF字符 - 当您按下和弦 CTRL - D 时,tty会向读取应用程序发送一个信号,表明输入流已完成返回一个sentinel值以使其退出。
为了防止将此字符视为进一步输入,它必须是特殊字符(例如超出范围的字符,如-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)时,一般形式是:
陷阱[命令] [信号捕捉]
答案 1 :(得分:4)
只需使用while read
:
while read cmd; do
echo $cmd
done