如何在退出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 [命令] [要捕获的信号]
只需使用while read
:
while read cmd; do
echo $cmd
done
while read
起作用的原因:当它遇到 eof 时,read 会以非零状态退出,而 while 循环也会随之退出。 - glenn jackman
[ ! -n "$cmd" ]
将无法工作。 - pynexj