2

我有一个 Perl 包装脚本,wrapperexec是设置一些环境变量后的另一个工具。包装器可能调用的工具是wrapper符号链接的,它通过评估动态确定符号链接到它的工具basename($0)。这是一个人为的例子来说明:

[/tmp]$ cat wrapper
#!/usr/bin/perl    
use File::Basename;

$ENV{'CUSTOM_ENVIRONMENT'} = '1';

my $scriptName = basename($0);
exec("scripts/${scriptName}");

[/tmp]$ chmod +x wrapper
[/tmp]$ cat scripts/foo
#!/bin/sh
echo "foo"

[/tmp]$ ln -s wrapper foo
[/tmp]$ ./foo 
foo

我想避免在直接调用之前需要虚拟foo符号链接并明确设置。是否可以在调用 Perl 脚本之前显式设置?$0wrapper$0

我知道我可以$0内部 wrapper分配给,但我想在调用之前$0设置要使用的值,所以我可以欺骗 Perl 认为正在运行的文件名。wrapper

我已经扫描过了perlrunperlvar但没有发现任何东西。

4

2 回答 2

1

这是一个可能的黑客:

perl -e '$0="something_else"; do "/path/to/wrapper"'
于 2013-07-10T08:08:54.553 回答
0

这是一个包装器包装器:

open (my $wrapper, "<", "wrapper") or die("$!");
my $c = '$0 = "SPOOF";'.join("", <$wrapper>);
close ($wrapper);
eval $c; 
于 2013-07-10T08:12:03.427 回答