【问题标题】:Catch CTRL +D in ksh在 ksh 中捕获 CTRL +D
【发布时间】:2023-03-28 22:03:01
【问题描述】:

如何在ksh 和退出后捕捉 CTRL+D 键盘?

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

done

【问题讨论】:

    标签: linux shell ksh


    【解决方案1】:

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

    【讨论】:

    • [ ! -n "$cmd" ] 在不输入任何字符的情况下按 ENTER 将不起作用。
    【解决方案2】:

    只需使用while read:

    while read cmd; do
      echo $cmd
    done
    

    【讨论】:

    • 好的,谢谢。有用。但是我该如何使用比较呢?
    • 为什么要使用比较?
    • 个人文化和提高我的技能。也许有一天当我按下 ctrl + 某些东西时我需要休息一下
    • 当看到 EOF 时, read 什么也得不到。 CTRL-D 仅用于指示 EOF。它与其他 CTRL 不同——比如 CTRL-C 通常会发送信号。
    • 更好的是,当 read 获取 eof 时,命令以非零状态退出。这正是while read 起作用的原因:当它遇到 eof 时,read 退出非零,并且 while 循环可以退出。
    猜你喜欢
    • 2012-06-14
    • 1970-01-01
    • 1970-01-01
    • 2011-01-06
    • 1970-01-01
    • 1970-01-01
    • 2013-03-17
    • 1970-01-01
    • 2010-10-23
    相关资源
    最近更新 更多