如何使用/ usr/bin/env perl功能以及perl参数?

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)

希望有所帮助!