停止Ruby脚本时如何抑制^ C被打印?

时间:2016-12-20 00:03:14

标签: ruby

我有一个长期运行的Ruby脚本。当用户点击CTRL-C时,有什么方法可以抑制^ C被打印?

trap 'SIGINT' do
  puts "SIGINT received. Exiting."
  exit
end

loop do
  ...
end

我发现put "\b\bSIGINT..."有效,但感觉就像是黑客。

3 个答案:

答案 0 :(得分:5)

不是“Ruby”打印^C,它只是来自终端的常规键盘输入。如果您键入asd,那么也将显示在您的终端中。这是因为在终端中,所有“特殊”键(ctrl +键,alt +键,F1等)都不是那么“特殊”,因为它们实际上只是一个字符(或几个字符)被发送。 / p>

您可以通过运行脚本并按下F1(在我的系统上显示为^[OP),退格(^H^?)等密钥来自行查看等等。

这是20世纪60年代电传手机的遗产,所有数据都是通过一个串行文本连接传输的。

有一些方法可以解决这个问题:

  • 正如tadman已经提到的,你可以使用\r字符,它将光标放在行的开头。它实际上并没有“擦除”任何东西,但可以用其他东西覆盖^C。请注意,^C打印在新行上,因此这可能无法在所有情况下都有效。您的puts "\b\bSIGINT"可能是更好的解决方案!

  • 第二种方法是使用stty命令来阻止回显输入:

    trap 'SIGINT' do
      puts "SIGINT received. Exiting."
      exit
    end
    
    # Don't echo input characters
    `stty -echo`
    loop do
      sleep 1
    end
    

    某些系统(例如Linux)也支持ctlecho选项,该选项仅阻止控制字符的回显(例如^C)。

答案 1 :(得分:2)

您可以将IO#echo=设置为false

来防止这种情况发生
require 'io/console'

STDIN.echo = false

答案 2 :(得分:1)

如果你想踩到一些输出:

puts "\rSIGINT"

\r字符将光标移动到当前行的开头。