use*_*107 4 linux perl trace environment-variables
我有一个与shebang的perl脚本
#!/usr/bin/env perl
Run Code Online (Sandbox Code Playgroud)
我希望这个脚本在执行时打印每一行.所以我安装了Devel :: Trace并将脚本更改为shebang
#!/usr/bin/env perl -d:Trace
Run Code Online (Sandbox Code Playgroud)
但这会产生错误,因为它不是有效的语法.
我应该怎么做才能使用env功能和tracing功能?
mwp*_*mwp 10
这是某些系统上Just Not not Work™的其中一项,特别是那些具有GNU的系统env.
这是我在过去使用的perlrun中提到的一个偷偷摸摸的解决方法:
#!/bin/sh
#! -*-perl-*-
eval 'exec perl -x -wS $0 ${1+"$@"}'
if 0;
print "Hello, world!\n";
Run Code Online (Sandbox Code Playgroud)
这将perl在您的PATH上找到,您可以在命令行中添加您想要的任何其他开关.您甚至可以在perl调用之前设置环境变量等.一般的想法是sh运行eval,但perl没有,并且额外的粗糙位确保Perl正确找到您的程序并传递所有参数.
#!/bin/sh
FOO=bar; export FOO
#! -*-perl-*-
eval 'exec perl -d:Trace -x -wS $0 ${1+"$@"}'
if 0;
$Devel::Trace::TRACE = 1;
print "Hello, $ENV{FOO}!\n";
Run Code Online (Sandbox Code Playgroud)
如果使用.pl扩展名保存文件,编辑器应检测正确的文件语法,但最初的shebang可能会将其丢弃.另一个警告是,如果脚本的Perl部分抛出错误,则行号可能会关闭.
关于这个技巧的巧妙之处在于它也适用于Ruby(可能还有一些其他语言,如Python,还有其他修改):
#!/bin/sh
#! -*-ruby-*-
eval 'exec ruby -x -wS $0 ${1+"$@"}' \
if false
puts "Hello, world!"
Run Code Online (Sandbox Code Playgroud)
希望有所帮助!
| 归档时间: |
|
| 查看次数: |
389 次 |
| 最近记录: |