【问题标题】:Accessing shell variable in a Perl program在 Perl 程序中访问 shell 变量
【发布时间】:2011-10-21 07:52:21
【问题描述】:

我有这个 Perl 脚本:

#!/usr/bin/perl

$var = `ls -l \$ddd` ;
print $var, "\n";

而 ddd 是一个 shell 变量

$ echo "$ddd"
arraytest.pl

当我执行 Perl 脚本时,我会得到目录中所有文件的列表,而不是只有一个文件,其文件名包含在 shell 变量 $ddd 中。

这里发生了什么?请注意,我在 Perl 脚本的反引号中转义了 $ddd。

【问题讨论】:

    标签: linux perl bash


    【解决方案1】:

    哈希 %ENV 包含您当前的环境。

    $var = `ls -l $ENV{ddd}`;
    

    /edit - 它工作,检查,当然需要在运行脚本之前导出 ddd

    export ddd='arraytest.pl'
    perl script.pl
    

    【讨论】:

    • 只有当它是一个环境变量时——如果它是,原始代码会起作用,因为它将文字 '$ddd' 传递给外壳,外壳会扩展它。
    • 它没有用。我试图打印 $ENV{ddd} 但没有 o/p。
    • 是的,很好理解它不是环境变量。它是一个shell变量。我没有导出它。有没有办法在 Perl 的反引号中指定 shell 变量?
    • @abc:不,没有。除了 shell 本身之外,任何进程都无法看到 shell 变量。
    【解决方案2】:

    变量 $ddd 没有在您从 Perl 脚本调用的 shell 中设置。

    普通的shell变量不被子进程继承。环境变量是。

    如果您想让它工作,您需要在调用 Perl 脚本之前在 shell 中执行以下操作之一:

    ddd=arraytest.pl ; export ddd # sh
    
    export ddd=arraytest.pl       # bash, ksh, zsh
    
    setenv ddd arraytest.pl       # csh, tcsh
    

    这将使环境变量$ddd 在您的 Perl 脚本中可见。但是,将其称为 $ENV{ddd} 可能更有意义,而不是将文字字符串 '$ddd' 传递给 shell 并让它扩展它:

    $var = `ls -l $ENV{ddd}`;
    

    【讨论】:

    • sh 变体当然可以移植到任何与 Bourne 兼容的 shell(包括 ksh 等); export variable=value 语法在 shell 之间是模棱两可的,所以你应该避免它,除非你专门针对例如重击。详情unix.stackexchange.com/questions/193095/…
    【解决方案3】:

    你忘了export ddd:

    标记每个名称以传递给环境中的子进程。

    所以ddd 不会自动提供给子进程。

    【讨论】:

    • 感谢发布参考链接!
    • @abc:Keith 的彻底性很好,我只为那个链接留下了答案。
    • @nxadm:但它不会在%ENV 中,因为它是一个 shell 变量,而不是 environment 变量,直到您导出它.比较 ddd='pancakes';perl -e 'say $ENV{ddd}、ddd='pancakes' perl -e 'say $ENV{ddd}' 和 export ddd='pancakes';perl -e 'say $ENV{ddd}'。
    猜你喜欢
    • 2014-04-30
    • 2020-05-01
    • 2017-07-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-25
    • 2015-05-02
    • 2017-10-14
    相关资源
    最近更新 更多