我想在perl脚本中更改die消息的颜色。我目前正在使用Term::ANSIColor在我的脚本中进行其他颜色更改。我遇到的消息是,一旦脚本死掉它就无法将颜色重置为终端默认值,终端提示符是我脚本中最后使用的颜色。在这种情况下,它会变成红色。
我知道如何让脚本死掉但仍然会改变颜色吗?
这是有问题的代码块;
#!/usr/bin/perl
use strict;
use warnings;
require Term::ANSIColor;
use Term::ANSIColor;
print "Loading configuration file\n";
# Check if the specified configuration file exists, if not die
if (! -e $config_file_path) {
print color 'red';
die "$config_file_path not found!\n";
print color 'reset';
} else {
print color 'green';
print "$config_file_path loaded\n";
print color 'reset';
}
更新
它有效,但现在我无法摆脱模具陈述的部分,说明它发生了什么线。
Loading configuration file
/etc/solignis/config.xml not found!
at discovery.pl line 50.
通常我只是在die函数中添加一个换行符,并且消除了die的任何正常错误输出。知道为什么这样做吗?
更新2
根据你的所有建议,我把它拼凑在一起。
print STDERR RED, "$config_file_path not found!";
die RESET, "\n";
它似乎工作正常。使用Term :: ANSIColor 1的常量是我需要完美的事情。
答案 0 :(得分:14)
die
正在打印到STDERR,而print
将转到STDOUT。
print STDERR color 'red';
die "$config_file_path not found!\n";
请注意......你刚刚去世了。您的“重置”不会打印
您希望将其连接到die
:
die color 'red' . "$config_file_path not found!" . color 'reset';
您还可以使用常量:
use Term::ANSIColor qw(:constants);
die RED, "THis is death!", RESET, "\n";
编辑:抱歉 - 要摆脱“发生的地方”部分,将\n
连接到最后:
die color 'red' . "$config_file_path not found!" . color 'reset' . "\n";
答案 1 :(得分:4)
有几种方法可以做到这一点。
使用Term::ANSIColor
的{{1}}函数,它似乎会在结尾处自动添加ANSI重置序列:
colored
使用die colored( "$config_file_path not found!\n", 'red' );
:
Term::ANSIColor
或
use Term::ANSIColor qw( :constants );
$Term::ANSIColor::AUTORESET = 1;
die RED "$config_file_path not found!\n";
您还可以陷阱使用带有coderef的die RED, "$config_file_path not found!\n", RESET;
或$SIG{__DIE__}
块,并在打印参数后重置它。 (这些可能不是最好的想法,但它们可以让你在几乎任何退出环境下重置颜色。)
答案 2 :(得分:4)
我确定你将终端重置为黑色的END{}
块是最干净的解决方案。这就是这样的事情。
不使用$SIG{__DIE__}
进行操作,否则您会感到不快。没有人意识到即使对于被困异常也会被调用!!
答案 3 :(得分:0)
您可以使用__DIE__
处理程序:
$SIG{'__DIE__'} = sub {
print color 'reset';
};
由于实施故障,所以
$SIG{__DIE__}
挂钩被称为偶数 在eval()
内。
因此,你可能不应该使用这种技术。