繁体   English   中英

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

[英]Using Bash environment variables from within a Perl script?

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

我如何才能将其全部读取为字符串?

这就是我要运行的

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

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

有任何想法吗?

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

Perl中有%ENV哈希 ,带有环境变量

perl -wE'say $ENV{PWD}'

但是,通常最好在脚本中使用等效项,因为脚本的含义可能会有所不同,或者在脚本运行时会有所变化。

更重要的是,使用shell命令会使您面临引号,shell注入和解释的各种潜在问题。 例如,您显示的命令很危险,如Charles Duffy注释中所述。 原则上,最好使用Perl的丰富功能。 例如看

清醒而详尽的优势说明。


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

如果您还需要使用外壳程序的功能,则可以使用String :: ShellQuote之类的现成工具,而不是为了正确地引用所有内容以便外壳程序接收所需的内容

一些例子:

请注意, qx运算符 (反引号)使用/bin/sh ,它可能降级为Bash,也可能不会降级为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而不是cwd

请注意,使用symlink不能传递目录而不是链接名称。 参见本页

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM