如何在bash包装器中调试perl

如何在bash包装器中调试perl,perl,bash,Perl,Bash,我正在调试一个由bash脚本启动的Perl程序。因为Perl脚本由大量Perl模块组成,并且需要提供极其复杂的选项,所以这里的bash包装器是绝对必要的 由于这个限制,在我的例子中,我不能使用Perl调试器,这是我猜想的最简单的方法。然后我转向旧的好的printf。但是,即使我在不同的模块中从一个位置向另一个位置添加了printfs,实际上也没有任何内容输出到启动bash包装器的终端 因此,我希望您首先解释为什么我无法从内部Perl脚本中获取任何打印信息,以及如何解决我在本例中的问题以调试Per

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

由于这个限制,在我的例子中,我不能使用Perl调试器,这是我猜想的最简单的方法。然后我转向旧的好的
printf
。但是,即使我在不同的模块中从一个位置向另一个位置添加了
printf
s,实际上也没有任何内容输出到启动bash包装器的终端

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

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

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

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

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

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

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

Quick bash Hack 应该可以将
STDOUT
STDERR
重定向到文件:

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

快速Perl攻击 滚动子对象以打印调试输出:

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最佳实践 及


不安 最好是。

Quick Bash Hack 应该可以将
STDOUT
STDERR
重定向到文件:

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

快速Perl攻击 滚动子对象以打印调试输出:

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最佳实践 及


不安
最好是。

“因为perl脚本由大量perl模块组成,并且需要提供极其复杂的选项,所以这里的bash包装器是绝对必要的”-这并没有遵循。Perl不缺少解析命令行选项或显示UI的工具,也不缺少编写处理CPAN依赖性的安装程序的系统。@Quentin:问题是没有人希望在每次运行时在命令行中手动提供选项列表,因此我们需要一个包装器,以某种方式硬编码大多数时间未更改的选项。但是你是对的,包装器不必是bash,完全同意。但是我们现在谈论的不是“每次运行”,而是“单个调试运行”。找出包装器是如何调用您的perl程序的,然后用一个额外的-d开关来调用它。“因为perl脚本由大量perl模块组成,需要提供极其复杂的选项,所以这里的bash包装器是绝对必要的”-这不符合要求。Perl不缺少解析命令行选项或显示UI的工具,也不缺少编写处理CPAN依赖性的安装程序的系统。@Quentin:问题是没有人希望在每次运行时在命令行中手动提供选项列表,因此我们需要一个包装器,以某种方式硬编码大多数时间未更改的选项。但是你是对的,包装器不必是bash,完全同意。但是我们现在谈论的不是“每次运行”,而是“单个调试运行”。了解包装器是如何调用perl程序的,然后使用额外的-d开关进行调用。