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()会产生同样的问题.
有任何想法吗?
这里有两个查询,使用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 :: cwd和FindBin用$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)
如果路径,就是要脚本的位置使用$RealBin从FindBin代替cwd.
请注意,使用符号链接时,您无法传递目录而不是链接名称.看到这个页面.
| 归档时间: |
|
| 查看次数: |
610 次 |
| 最近记录: |