2012-01-10 118 views
3

我无法编写简单的perl脚本,因此我可以同步两个文件夹。
我的代码是:Perl - 使用来自perl脚本的rsync

my $string= "rsync -va ~/Dropbox/Music\ \(1\)/ ~/Music/Music/"; 
`$string`; 

我也尝试了用线

`rsync -va /Dropbox/Music\ \(1\)/ ~/Music/Music/;` 

接下来我想:

my @args=("bash", "-c","rsync -va ~/Dropbox/Music\ \(1\)/ ~/Music/Music/"); 
system(@args);` 

我得到了同样的错误:

sh: -c: line 0: syntax error near unexpected token `(' each time 

(是的,在原始文件夹中的那些空间和parens是一个痛苦,但不要吼我,我没有创造它......)

+0

我已经尝试修正格式,但在一些地方,我不是100%肯定它是什么应该看起来像。请看看,并纠正需要更正的任何内容。 – ruakh 2012-01-10 01:40:53

+0

@ruakh谢谢,你如何逃避反斜杠字符,或者我误解了什么? – ImprovedSilence 2012-01-10 03:21:04

回答

1

问题是,你运行的实际shell命令是

rsync -va ~/Dropbox/Music (1)/ ~/Music/Music/ 

因为所有的反斜线被吞噬的Perl(因为它,诸如bash,使用反斜杠作为引用/转义字符)。为了避免这种情况,你需要或者使用单引号:

system 'rsync -va ~/Dropbox/Music\ \(1\)/ ~/Music/Music/'; 

否则重新逃不出你的反斜线:

system "rsync -va ~/Dropbox/Music\\ \\(1\\)/ ~/Music/Music/"; 
+0

完美,谢谢。为什么(以及如何)在Perl中使用单引号和双引号? – ImprovedSilence 2012-01-10 02:38:10

+1

@ImprovedSilence:Re:它们有何不同:单引号不插入变量(所以''foo''是''foo''和'“\ foo'''和'”\ @foo“ ',分别),并且它们不支持'\''和'\\'以外的反斜杠转义(所以''\ n''和''\ x0A''等同于'“\\ n”'和'“\\ x0A”')。回复:他们为什么不同:各种shell,比如Bash,都有这个功能。据我所知,Perl从来没有遇到过它不想偷的语言功能。 :-P – ruakh 2012-01-10 03:30:52

+0

@ImprovedSilence:顺便说一下,请参阅http://perldoc.perl.org/perlop.html#Quote-and-Quote-like-Operators了解更多相关功能。例如,'q {...}'和'q“...”'大致等同于'...'','qx'...''就像反引号,但不会导致插值。 。 。有很多。 :-) – ruakh 2012-01-10 03:33:02

1

执行

my $string= "rsync -va ~/Dropbox/Music\ \(1\)/ ~/Music/Music/"; 

后,你会看到$string包含

rsync -va ~/Dropbox/Music (1)/ ~/Music/Music/ 

这不是你想要执行的命令。 \在Perl双引号字符串文字(特别是其他)中是特殊的。要创建的字符串

rsync -va ~/Dropbox/Music\ \(1\)/ ~/Music/Music/ 

你需要

$string = "rsync -va ~/Dropbox/Music\\ \\(1\\)/ ~/Music/Music/"; 

或者,使用的system多arg格式。由于不涉及shell,因此不必担心为shell创建字符串文字。

my $src = $ENV{HOME}.'/Dropbox/Music (1)/'; 
my $dst = $ENV{HOME}.'/Music/Music/'; 
system('rsync', '-va', $src, $dst); 
1

此处不需要Perl。

#!/bin/sh 
rsync -va ~/Dropbox/Music\ \(1\)/ ~/Music/Music/ 

或者你可以添加以下内容~/.bashrc然后重新登录:

alias music_sync='rsync -va ~/Dropbox/Music\ \(1\)/ ~/Music/Music/'