在 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)时,一般形式为:

陷阱[命令][捕捉信号]