在 ksh 中捕获 CTRL +D
Catch CTRL +D in ksh
如何在 ksh
和退出后捕捉 CTRL+D 键盘?
while true; do
read cmd
echo $cmd
if [ "$cmd" = "?????" ]; then
break
fi
done
只需使用while read
:
while read cmd; do
echo $cmd
done
CTRL-D 是 "end-of-file (EOF)" 而你需要做的是 "trap" 这个输入。不幸的是,没有 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)时,一般形式为:
陷阱[命令][捕捉信号]
如何在 ksh
和退出后捕捉 CTRL+D 键盘?
while true; do
read cmd
echo $cmd
if [ "$cmd" = "?????" ]; then
break
fi
done
只需使用while read
:
while read cmd; do
echo $cmd
done
CTRL-D 是 "end-of-file (EOF)" 而你需要做的是 "trap" 这个输入。不幸的是,没有 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)时,一般形式为:
陷阱[命令][捕捉信号]