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

Rya*_*fer 3 linux bash perl pwd

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

我怎么能把它作为一个字符串全部读出来?

这就是我想要运行的

my $path = /first/path;
`ln -s $path $PWD/second/path`
Run Code Online (Sandbox Code Playgroud)

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

有任何想法吗?

zdi*_*dim 7

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

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

perl -wE'say $ENV{PWD}'
Run Code Online (Sandbox Code Playgroud)

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

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

对于一个清醒,详细,优势的说明.


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

如果你还需要使用shell的功能,而不是引用一切恰到好处的东西,以便shell更好地使用像String :: ShellQuote这样的现成工具.

一些例子:

请注意,qx运算符(反引号)使用/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: $!";
Run Code Online (Sandbox Code Playgroud)

如果路径,就是要脚本的位置使用$RealBinFindBin代替cwd.

请注意,使用符号链接时,您无法传递目录而不是链接名称.看到这个页面.