我正在尝试在Perl程序中运行Bash命令。 但是,Perl似乎将我的Bash $PWD环境变量误认为是Perl变量。
如何让它只将所有内容视为字符串?
这是我要运行的命令:
my $path = /first/path;
`ln -s $path $PWD/second/path`
那些反引号在Bash中运行第二行代码。使用System()也会遇到相同的问题。有什么想法吗?
%ENV
哈希表,用于存储环境变量。perl -wE'say $ENV{PWD}'
/bin/sh
,它可能会被降级为Bash。因此,如果您想要Bash,则需要system('/bin/bash', '-c', $cmd)
,其中$cmd
需要仔细构建以避免问题。请参阅示例链接。
这里是与问题背后目标相关的完整示例。
您的程序的工作目录可能与预期不同,具体取决于它如何启动。例如,在chdir
之后会发生变化。我不知道您对PWD
的确切意图,但在Perl中有核心Cwd::cwd
和FindBin,用于当前工作目录和脚本所在目录(通常是不同的东西)。
要创建指向$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: $!";
FindBin
中的$RealBin
而不是cwd
。请注意,使用symlink时,不能传递目录而不是链接名称。请参阅this page。
PWD
是由bash(以及其他像zsh
这样的shell)导出的;使用/usr/bin/printenv
来验证;它是一个“魔术”环境变量。 - Basile Starynkevitch\$
转义$
。 - user3458system()
或任何等效操作--如果你的路径可能包含$(rm -rf ~)
(是的,有可能创建一个实际文件或目录,其中包含该字符串),你不希望将其传递给shell而没有首先进行引用或转义(如果它是作为字符串文字中的$(rm -rf ~)'$(rm -rf ~)'
,那么即使您尝试通过注入字面单引号来使其安全,也会破坏其引用并造成严重后果)。 - Charles Duffy