【发布时间】:2012-10-30 06:06:31
【问题描述】:
我正在使用 Term::ReadLine::Gnu 并且遇到了信号处理问题。给定下面的脚本和发送到脚本的 TERM 信号,直到 按下回车键后,才会触发 TERM 信号的处理程序。使用 Term::ReadLine:Perl 不会发生这种情况。
我读过 Term::ReadLine::Gnu 有自己的内部信号处理程序,但坦率地说,我不知道如何使用它们。
我已经查看了http://search.cpan.org/~hayashi/Term-ReadLine-Gnu-1.20/Gnu.pm#Term::ReadLine::Gnu_Variables,尝试将 rl_catch_signals 变量设置为 0,但这没有帮助。理想情况下,我希望使用 Gnu 信号处理程序,但我也会满足于禁用它们。
确切地说,我需要在收到信号后触发 TERM 处理程序,而不是等待按下回车键。
非常感谢任何帮助或建议!
#!/usr/bin/perl
use strict;
use warnings;
use Term::ReadLine;
$SIG{TERM} = sub { print "I got a TERM\n"; exit; };
my $term = Term::ReadLine->new('Term1');
$term->ornaments(0);
my $prompt = 'cmd> ';
while ( defined (my $cmd = $term->readline($prompt)) ) {
$term->addhistory($cmd) if $cmd !~ /\S||\n/;
chomp($cmd);
if ($cmd =~ /^help$/) {
print "Help Menu\n";
}
else {
print "Nothing\n";
}
}
【问题讨论】:
-
我想知道这是否是一个缓冲问题。试试这个答案的解决方案:stackoverflow.com/a/7603502/1791055
-
/\S||\n/应该做什么? :-) (与您的实际问题无关,我只是注意到了。)请注意,由于您的两个管道之间没有任何内容,因此正则表达式将匹配任何内容,因此 !~ 将始终为假。 -
ysth 帮助我在另一篇帖子stackoverflow.com/questions/13332908/… 中回答了这个问题,事实证明这完全是多余的,因为 T:R:G 默认会添加历史记录。我会删除它。
-
titanofold - 感谢您的链接。当然很有趣(我会试一试),但我不确定这是否能解决这个问题。我认为这更多是关于使用 T:R:G 的内部信号处理。
标签: perl readline signal-handling