在Perl脚本中使用Bash环境变量?

时间:2017-05-25 16:40:51

标签: linux bash perl pwd

我正在尝试从我的Perl程序中运行Bash命令。 但是Perl似乎把我的Bash $ PWD环境变量混淆为Perl变量。

我怎样才能把它作为字符串全部读出来?

这就是我正在尝试运行的

my $path = /first/path;
`ln -s $path $PWD/second/path`

那些反引号在Bash中运行第二行。使用System()会产生同样的问题。

有什么想法吗?

1 个答案:

答案 0 :(得分:5)

这里有两个查询,包括使用Bash变量和运行外部命令。

Perl中有%ENV hash,带有环境变量

perl -wE'say $ENV{PWD}'

但是,您通常最好在脚本中获取等效内容,因为脚本可能具有略微不同的含义或脚本运行时更改。

更重要的是,使用shell命令会向您展示引用,shell注入和解释等各种潜在问题。例如,您显示的命令很危险,如Charles Duffy评论中所述。原则上更好的是使用Perl丰富的功能。参见例如

对于优势的清醒和详细说明。

如果您确实需要运行外部命令,最好完全避免使用shell,例如使用system的多参数形式。如果您需要命令的输出,Perl中还有各种模块可以提供。请参阅以下链接。

如果你还需要使用shell的功能,而不是引用一切正确的东西,以便shell能够更好地接收它需要的东西,使用像String::ShellQuote这样的现成工具。

一些例子:

请注意,qx operator(反引号)使用/bin/sh,可能会也可能不会降级为Bash。所以如果你想要Bash,你需要system('/bin/bash', '-c', @cmd)。请参阅示例链接。

以下是与问题背后的目标相关的完整示例。

您的程序的工作目录可能不是预期的,具体取决于它的启动方式。例如,它在chdir之后发生变化。我不知道您使用PWD的确切意图,但在Perl中,核心Cwd :: cwdFindBin$RealBin,对于当前的工作目录和脚本所在的目录(通常是不同的东西)。

创建指向$path的符号链接,其中包含当前工作目录之后的相对路径

use warnings;
use strict;
use Cwd qw(cwd);

my $cwd = cwd;

my $path = '/first/path';

symlink($path, "$cwd/second/path") or die "Can't make a symlink: $!";

如果路径是脚本的位置,请使用$RealBin而不是FindBin的{​​{1}}。

请注意,对于symlink,您无法传递目录而不是链接名称。请参阅this page