Perl - 在命令行输出中出现停止错误

时间:2015-02-08 21:28:38

标签: bash perl error-handling output backticks

我有一个问题,我希望有人可以提供帮助...

我在做什么:

我有一个在简单的foreach循环中执行的以下反引号命令,并将命令输出保存到变量,然后我对该变量执行字符串匹配操作:

$ciphertestoutput = `echo -n | openssl s_client -cipher $tlsCipher -connect $ipaddress:443 2>/dev/null`;

问题:

但是,当我在输出中运行我的脚本时,我收到一条错误消息,我似乎无法停止显示。我并不担心错误发生,但我不希望错误显示在我所做的漂亮命令行输出的中间。

我的输出和错误:

EXP-DES-CBC-SHA CIPHER IS SUPPORTED on 192.168.1.22:443

EXP-EDH-DSS-DES-CBC-SHA CIPHER IS NOT SUPPORTED on 192.168.1.22.443

EXP-RC2-CBC-MD5 CIPHER IS NOT SUPPORTED on 192.168.1.22:443
connect: Connection refused          <--- the error I cant get rid of
connect:errno=111                    <--- the error I cant get rid of

EXP-RC4-MD5 CIPHER IS NOT SUPPORTED on 192.168.1.22:443

我尝试了什么:

我已尝试并尝试了各种各样的方法来抑制输出中的错误消息,但我尝试的任何方法都不会出现此错误。我过去做过很多类似的事情,但从来没有用反引号来解决这个问题。我有什么明显的遗失吗?

非常感谢您对此的帮助,谢谢

3 个答案:

答案 0 :(得分:4)

尝试在您的计划中重新打开 STDERR,如下所示:

open STDERR, '>/dev/null';    
# your command

qx - 命令的错误将不会显示。因此,您不必担心如何致电您的计划。

P.S。如果您需要,也可以保存STDERR

open OLDERR, ">&", \*STDERR; # or die "$!";
open STDERR, ">/dev/null"; # or die "$!";
# your command
open STDERR, ">&OLDERR"; # restoring your stderr
close OLDERR;
# other code

答案 1 :(得分:2)

考虑使用IPC::Run3

use IPC::Run3;    # Exports run3() by default

run3 \@cmd, \$in, \$out, \$err;

它将stdin,stdout和stderr分隔成不同的引用。至少,它应该可以帮助你弄清楚发生了什么。

答案 2 :(得分:-1)

你确定这些是错误而不是OpenSSL输出(来STDOUT而不是STDERR)?如果您的所有预期输出都以EXP开头,就像您的示例一样,您可以尝试添加

| grep EXP

进行测试。