spr*_*aff 3 debugging shell perl shellexecute system-calls
我有一个调用其他程序的Perl脚本,即调用system和/或exec和/或open使用管道和/或使用反引号运算符.
我是否可以运行此脚本,以便打印出上述每个参数的参数,以便我可以看到它调用的是什么?
例如像我这样的程序,我无法修改
#!/usr/bin/perl
sub get_arg {return "argument$_[0]";}
system "./foo", get_arg(1), get_arg(2);
print `./foo abc def`;
Run Code Online (Sandbox Code Playgroud)
调用了类似这样的东西
perl --shell-trace-on ./myscript.pl
在这种情况下输出
./foo argument1 argument2
./foo abc def
Run Code Online (Sandbox Code Playgroud)
抛弃myscript.pl的正常输出或将其与此跟踪混合是可以接受的.
非常感谢.
这被认为是高级Perl,但您可以CORE::GLOBAL在编译时在命名空间中定义子例程并劫持Perl的内置函数.调用CORE命名空间中的函数将调用原始内置函数.
BEGIN {
# have to use a BEGIN block so these functions are defined before
# run time
*CORE::GLOBAL::system = sub {
print STDERR "about to invoke system @_\n";
return CORE::system(@_);
};
*CORE::GLOBAL::qx = sub {
print STDERR "about to invoke qx/backticks @_\n";
return CORE::qx(@_);
};
*CORE::GLOBAL::exec = sub { ... };
};
system("sleep 5");
print `ls`;
1;
Run Code Online (Sandbox Code Playgroud)
要将此功能应用于任意独立脚本,您可以将此代码放入一个简单的模块(例如,ShellTrace.pm),然后perl使用该-MShellTrace开关调用.(HT:perlman):
package ShellTrace;
BEGIN {
*CORE::GLOBAL::system = sub { ... };
*CORE::GLOBAL::qx = sub { ... };
*CORE::GLOBAL::exec = sub { ... };
*CORE::GLOBAL::open = sub { ... };
}
1;
$ perl -MShellTrace ./myscript.pl
about to invoke system ./foo argument1 argument2
about to invoke qx/backticks ./foo abc def
...
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
216 次 |
| 最近记录: |