我有两个版本的方法,我都遇到了同样的问题。
版本 1
def read_char
$stdin.raw!
input = $stdin.getc.chr
if input == "\e" then
input << $stdin.read_nonblock(3) rescue nil
input << $stdin.read_nonblock(2) rescue nil
end
ensure
$stdin.cooked!
return input
end
第 2 版
def read_char
system("stty raw -echo")
input = $stdin.getc.chr
if input == "\e" then
input << $stdin.read_nonblock(3) rescue nil
input << $stdin.read_nonblock(2) rescue nil
end
ensure
system("stty -raw echo")
return input
end
我对两者都有同样的问题。具体来说,它们修改了 Kernel#system 命令的行为。
举个例子:
system("irb")
c=read_char
system("irb")
很容易看到系统的行为发生了变化,并且在第二个版本中,输入输出不是从 tty 中提取的。
请注意,当您按下任何键时,这不会发生,只是一个被转换为转义序列的键,例如光标键。
那么这是如何修复的呢?
附言
有人建议我在第二个位置运行 system("strace -o logfile irb") 并检查读取语句。相反,我跟踪了两个 irbs 并进行了比较。除了最后一个之外,所有的读取语句都是相同的,而且它们都是如此。最后的阅读看起来不同:
1st system: read(0, "1\n", 1024) = 2
2nd system: read(0, 0x7ff805a53000, 1024) = -1 EAGAIN (Resource temporarily unavailable)
0x7ff805a53000 is the address of a memory mapped region.
聚苯乙烯
我在linux系统上做这个。