perl system()rsync包含带空格的变量路径

cidc1ykv  于 2022-12-23  发布在  Perl
关注(0)|答案(1)|浏览(242)

我需要向Perl的systemrsync命令传递一个带空格的变量路径。

$mht_user = "username";
$mht_share = "/mypath/with some space/01. continue/another space/";
$mht_dstpath = $mht_user.'@'.$mht_host.":".$mht_share."";

我需要将目标路径传递给rsync命令

system ("/usr/bin/rsync -acz -H --delete /my source path ".$mht_dstpath.");

rsync不喜欢带有空格的路径,所以我尝试以这种模式编写路径:

$mht_share = "/mypath/with\ \some\ \space/01.\ \continue/another\ \space/";

rsync接受它,但它将路径分为:

/mypath/with

如何将带空格的路径传递给rsync?

ttcibm8c

ttcibm8c1#

了解问题

这最终是一个shell问题,让我们跳出循环,用rsync来说明这个问题
下面是一个简单的脚本printargs.pl,它列出了它的参数,我们可以用它来显示运行system时实际传递给程序的内容

#!/usr/bin/perl

use strict;
use warnings;

print "[$_]\n" for @ARGV;

现在使用您正在使用的一些参数列表调用它

use strict;
use warnings;

my $mht_user = "username";
my $mht_host = "host";
my $mht_share = "/mypath/with some space/01. continue/another space/";
my $mht_dstpath = $mht_user.'@'.$mht_host.":".$mht_share."";

system ("perl /tmp/echoargs.pl -acz -H --delete /my source path $mht_dstpath.");

输出为

[-acz]
[-H]
[--delete]
[/my]
[source]
[path]
[username@host:/mypath/with]
[some]
[space/01.]
[continue/another]
[space/.]

注意,shell在嵌入的空格上拆分了/my source path username@host:/mypath/with some space/01. continue/another space/.

选项1:使用Shell报价

您可以使用单引号将字符串括起来并嵌入空格,如下所示

use strict;
use warnings;

my $mht_user = "username";
my $mht_host = "host";
my $mht_share = "/mypath/with some space/01. continue/another space/";
my $mht_dstpath = $mht_user.'@'.$mht_host.":".$mht_share."";

# Use single-quotes to enclose the string with embedded spaces 
system ("perl /tmp/echoargs.pl -acz -H --delete '/my source path $mht_dstpath.'");

输出为

[-acz]
[-H]
[--delete]
[/my source path username@host:/mypath/with some space/01. continue/another space/.]

选项2:避免使用 shell

这来自system文档
如果LIST中有多个参数,或者LIST是一个具有多个值的数组,则使用列表中其余元素提供的参数启动列表中第一个元素提供的程序。
这句话有点令人困惑,它的意思是--如果您将程序名及其参数作为Perl列表传递给system,您将绕过shell。

use strict;
use warnings;

my $mht_user = "username";
my $mht_host = "host";
my $mht_share = "/mypath/with some space/01. continue/another space/";
my $mht_dstpath = $mht_user.'@'.$mht_host.":".$mht_share."";

# pass parameters individually to bypass the shell
system ("perl", "/tmp/echoargs.pl",  "-acz",  "-H",  "--delete",  "/my source path $mht_dstpath.");

产出

[-acz]
[-H]
[--delete]
[/my source path username@host:/mypath/with some space/01. continue/another space/.]

相关问题