如何在 bash 包装器中调试 perl

发布于 2024-12-18 09:24:39 字数 313 浏览 0 评论 0原文

我正在调试由 bash 脚本启动的 Perl 程序。因为Perl脚本由大量的Perl模块组成,需要提供极其复杂的选项,所以这里的bash包装器肯定是必要的。

由于这个限制,就我而言,我无法使用 Perl 调试器,这是我认为最简单的方法。然后我转向旧的好 printf。但是,即使我将 printf 从不同模块中的一个位置添加到另一个位置,实际上没有任何内容打印到我启动 bash 包装器的终端。

因此,我希望您首先解释一下为什么我无法从 Perl 脚本内部获取任何打印信息,以及如何解决我在这种情况下调试 Perl 程序的问题。

I'm debugging a Perl program started by a bash script. Because the Perl script consist of a huge number of Perl modules and needs to provide extremely complex options, so the bash wrapper here is definitely necessary.

Due to that limitation, in my case I can't use Perl debugger, which is the easiest way I guess. Then I turn to the old good printf. But, even though I add printfs from one to another places in different modules, nothing actually be printed out to the terminal where I start the bash wrapper.

So, I'd like you to first explain why I can't get any print info from the inside Perl scripts and how to solve my problem in this case to debug the Perl program.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

黎歌 2024-12-25 09:24:39

解释为什么我无法从 Perl 脚本内部获取任何打印信息

大概是您的 bash 脚本正在吞噬输出。

弄清楚 bash 正在做什么,并使用相同的参数和环境变量直接调用 perl。

explain why I can't get any print info from the inside perl scripts

Presumably your bash script is swallowing the output.

Figure out what the bash is doing, and call perl directly with the same arguments and environment variables.

心的憧憬 2024-12-25 09:24:39

Quick Bash Hack

应该可以将 STDOUTSTDERR 重定向到文件:

# Inside the bash script
perl myScript.pl 1>perl_log.out 2>perl_log.err

Quick Perl Hack

滚动一个子程序来打印调试输出:

use constant debug_flag => 1; # At top of script(s)

{  my $debug_handle;

    sub debug {

        return unless debug_active;  # Only prints debug msgs if debug active

        unless ( $debug_handle ) {   # Initialize debug log

            open $debug_handle, '>', 'perl_log.out' or die $!;
        }

        print $debug_handle @_, "\n";
    }
}

# call with 'debug'

debug ( 'Array length : ', scalar @array );

Perl 最佳实践

use Log::Log4perl;  # Wonderful logging module

use Carp;
local $SIG{__DIE__} = \&Carp::confess;  # Print out stack traces...
local $SIG{__WARN__} = \&Carp::cluck;   # ... when using die and warn

Qualm

最好 尽可能避免 printf 并使用 print相反

Quick Bash Hack

It should be possible to redirect STDOUT and STDERR to file:

# Inside the bash script
perl myScript.pl 1>perl_log.out 2>perl_log.err

Quick Perl Hack

Roll a sub to print debug output:

use constant debug_flag => 1; # At top of script(s)

{  my $debug_handle;

    sub debug {

        return unless debug_active;  # Only prints debug msgs if debug active

        unless ( $debug_handle ) {   # Initialize debug log

            open $debug_handle, '>', 'perl_log.out' or die $!;
        }

        print $debug_handle @_, "\n";
    }
}

# call with 'debug'

debug ( 'Array length : ', scalar @array );

Perl Best Practices

use Log::Log4perl;  # Wonderful logging module

and

use Carp;
local $SIG{__DIE__} = \&Carp::confess;  # Print out stack traces...
local $SIG{__WARN__} = \&Carp::cluck;   # ... when using die and warn

Qualm

It's better to avoid printf whenever possible and use print instead.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文