我可以从 Perl 捕获 shell 调用吗?
我有一个调用其他程序的 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`;
调用的东西可能是这样的
perl --shell-trace-on ./myscript.pl
在这种情况下将输出
./foo argument1 argument2
./foo abc def
丢弃 myscript.pl 的正常输出或将其与此跟踪混合是可以接受的。
多谢。
I have a Perl script which invokes other programs, i.e. it calls system
and/or exec
and/or open
with a pipe and/or uses the backtick operator.
Can I run this script in such a way that it will print out the arguments to each of the above so that I can see what it is calling into?
For example a program like this which I cannot modify
#!/usr/bin/perl
sub get_arg {return "argument$_[0]";}
system "./foo", get_arg(1), get_arg(2);
print `./foo abc def`;
Invoked something perhaps like this
perl --shell-trace-on ./myscript.pl
Which will in this case output
./foo argument1 argument2
./foo abc def
It is acceptable to throw away myscript.pl's normal output or blend it with this trace.
Thanks a lot.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
这被认为是高级 Perl,但您可以在编译时在 CORE::GLOBAL 命名空间中定义子例程并劫持 Perl 的内置函数。
调用
CORE
命名空间中的函数将调用原始的内置函数。要将此功能应用于任意独立脚本,您可以将此代码放入一个简单的模块(例如
ShellTrace.pm
)中,然后使用调用
开关。 (HT:帕尔曼):perl
-MShellTraceThis is considered advanced Perl, but you can define subroutines in the
CORE::GLOBAL
namespace at compile time and hijack Perl's builtin functions.Calling functions in the
CORE
namespace will invoke the original builtin functions.To apply this feature to an arbitrary standalone script, you can put this code into a simple module (say,
ShellTrace.pm
), and then invokeperl
with the-MShellTrace
switch. (HT: perlman):不,系统命令不会将其执行的命令放入任何特殊变量中。
No, the system command does not put its executed command in any special variables.