我有一个长期运行的Ruby脚本。当用户点击CTRL-C时,有什么方法可以抑制^ C被打印?
trap 'SIGINT' do
puts "SIGINT received. Exiting."
exit
end
loop do
...
end
我发现put "\b\bSIGINT..."
有效,但感觉就像是黑客。
答案 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
字符将光标移动到当前行的开头。