【发布时间】:2017-10-26 09:48:09
【问题描述】:
我正在尝试从我的 Perl 程序中运行 Bash 命令。 但是 Perl 似乎将我的 Bash $PWD 环境变量混淆为 Perl 变量。
我怎样才能让它全部作为字符串读取?
这就是我要运行的内容
my $path = /first/path;
`ln -s $path $PWD/second/path`
那些反引号在 Bash 中运行第二行。使用 System() 会产生同样的问题。
有什么想法吗?
【问题讨论】:
-
PWD被 bash 导出(以及其他 shell,如zsh);使用/usr/bin/printenv来验证;这是一个magic环境变量 -
@BasileStarynkevitch,我的立场是正确的。
-
使用
\$转义$ -
@RyanSaffer, ...btw,一般来说,这种代码是非常危险的。使用本机 Perl 操作比使用
system()或任何等效操作要好得多 - 如果您的路径可以包含$(rm -rf ~)(是的,可以使用该字符串创建一个实际的文件或目录它的名字),你不希望它在没有被引用或首先被转义的情况下被传递给 shell(如果它是$(rm -rf ~)'$(rm -rf ~)'作为名称中的字符串文字,这将有助于转义它的引用并造成严重破坏,即使您试图通过在周围注入文字单引号来使其安全)。 -
我确定这个问题是重复的,但是选择的重复问题是一个糟糕的选择。