在ksh中捕获CTRL + D

3

如何在退出ksh之前捕获CTRL+D组合键?

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

done
2个回答

7

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 [命令] [要捕获的信号]


当按下 ENTER 键而没有输入任何字符时,[ ! -n "$cmd" ] 将无法工作。 - pynexj

4

只需使用while read

while read cmd; do
  echo $cmd
done

是的,谢谢。它有效。但是我如何使用比较? - Marco Rocci
为什么你必须使用比较? - pynexj
为了个人文化和提高我的技能,也许有一天我需要在按下Ctrl +某些键时暂停。 - Marco Rocci
当读取到EOF时,read函数将不会获取任何内容。CTRL-D仅用于指示EOF,它与其他类似CTRL-C的组合键不同,后者通常会发送一个信号。 - pynexj
对于信号:链接1链接2链接3,对于EOF:链接4 - pynexj
1
更好的是,当读取到 eof 时,该命令会以非零状态退出。这正好是 while read 起作用的原因:当它遇到 eof 时,read 会以非零状态退出,而 while 循环也会随之退出。 - glenn jackman

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接