在ksh中捕获CTRL + D.

时间:2015-02-10 14:49:40

标签: linux shell ksh

如何在ksh和退出后抓住 CTRL + D 键盘?

while true; do
  read cmd
  echo $cmd
  if [ "$cmd" = "?????" ]; then
        break
  fi

done

2 个答案:

答案 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