我可以在运行Perl脚本之前显式指定$ 0吗?

时间:2013-07-10 07:43:48

标签: perl bash shell unix

我有一个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符号链接,并在直接调用$0之前显式设置wrapper是否可以在调用Perl脚本之前显式设置$0

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

我已通过perlrunperlvar进行了扫描,但未找到任何内容。

2 个答案:

答案 0 :(得分:1)

这是一个可能的黑客:

perl -e '$0="something_else"; do "/path/to/wrapper"'

答案 1 :(得分:0)

这是一个包装器包装器:

open (my $wrapper, "<", "wrapper") or die("$!");
my $c = '$0 = "SPOOF";'.join("", <$wrapper>);
close ($wrapper);
eval $c;