【问题标题】:Use special characters inside perl script for system calls在 perl 脚本中使用特殊字符进行系统调用
【发布时间】:2011-06-23 14:09:16
【问题描述】:

我正在用 Perl 编写一个简短的安装脚本,它设置用户的环境变量以查找某些库。我正在使用system() 函数来设置$PATH 变量。但是,由于这需要使用特殊字符 $,Perl 不喜欢它。

system("export PATH=$PATH:/library/directory/here");

这没有任何作用,因为它试图替换$PATH。当我像这样逃避美元符号时:

system("export PATH=\$PATH:/library/directory/here");

这也不行。

我能做什么?

【问题讨论】:

标签: perl path environment-variables


【解决方案1】:

如果要更新 PATH 系统变量,请使用:

$ENV{'PATH'}.=':/library/directory/here';

在此 /library/directory/here 之后,将通过 PATH 访问此进程和所有分叉进程:

...
system("echo old PATH=$PATH");
$ENV{'PATH'}.=':/library/directory/here';
system("echo new PATH=$PATH");
...

【讨论】:

  • 这是替换 $PATH 变量还是只是更新它?我更喜欢后者,显然:)
  • 这仍然只会影响 perl 进程的子进程。比 system 变体更好,它什么都不做,但仍然可能不是我们想要的:)
  • @yavoh 这将更新 $PATH (点 (.) 是一个连接)并将可用于所有分叉进程(使用 system() 或反引号操作),即在这个脚本中 - 它作为我理解足以解决您的问题。
【解决方案2】:

*NIX 与 Windows 不同,每个进程都有一个单独的环境。当您通过系统设置 PATH 时,它会在子进程中更改它。但随后系统命令完成,因此其环境作为进程清理的一部分被删除。

通过 ENV 设置 PATH 会将其设置为 Perl 脚本和所有从它派生出来的进程。它会在运行脚本的 shell 中设置 PATH。这必须通过用于 csh 的 source 命令和用于 bash 的点命令“.”分别完成。详情请见man bash

【讨论】:

    【解决方案3】:

    在 perl 中使用双引号时,它会替换字符串中的变量。使用单引号 perl 不会解释其中的 $。

    【讨论】:

    • 很高兴知道!这就是我学习新语言的临时方法所得到的。谢谢:)
    【解决方案4】:

    使用单引号,例如

    我的 $cmd = 'export PATH=$PATH:/library/directory/here'; 系统($cmd);

    或者,您可以创建一个导出 PATH 变量的 bash 脚本。
    您可能还考虑使用您尝试从 Perl 调用的脚本的完整路径,而不是仅通过其名称调用程序,例如使用 /usr/env/perl 而不是 perl。

    【讨论】:

    • 它仍然不会设置用户的路径。
    • 易卜拉欣是对的。有什么方法可以将评论标记为正确答案?
    猜你喜欢
    • 2021-06-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-02-10
    • 1970-01-01
    相关资源
    最近更新 更多