【问题标题】:Can I explicitly specify $0 before running a Perl script?我可以在运行 Perl 脚本之前明确指定 $0 吗?
【发布时间】:2013-07-10 07:43:48
【问题描述】:

我有一个 Perl 包装脚本 wrapper,它是设置一些环境变量后的另一个工具 exec。包装器可能调用的工具符号链接到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

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

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

我扫描了perlrunperlvar,但没有找到任何东西。

【问题讨论】:

  • 您能详细描述一下您想做什么吗?调用者应该存在于系统中,因此必须定义硬链接或符号链接或别名或更确切地说是 bash 函数才能从提示符调用。因此,如果您确实想创建符号链接,您应该在 .bash_profile(或类似名称)中定义别名或函数,或将参数传递给 wrapper 并将其称为 wrapper foo(或类似名称)。但也许我误解了你的目标。

标签: perl bash shell unix


【解决方案1】:

这是一个可能的黑客:

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

【讨论】:

    【解决方案2】:

    这是一个包装器包装器:

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

    【讨论】:

      猜你喜欢
      • 2010-12-06
      • 2014-03-05
      • 1970-01-01
      • 2017-12-01
      • 2020-01-27
      • 2011-09-09
      • 1970-01-01
      • 1970-01-01
      • 2010-12-31
      相关资源
      最近更新 更多