2012-01-10 106 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/'