2017-03-01 28 views
0

私はこのように見て本当のシンプルなrsync bashのファイルを持っている:rsyncがbashで動作しないのはなぜですか?

#!bin/bash 
rsync -avh --exclude={"/media/*","/dev/*","/proc/*","/sys/*","/tmp/*","/run/*","/mnt/*","/lost+found/*"}//my/backup/path 

を私が行うときに問題がある:

sh mybash.sh 

それは私がいくつかのすべてのバックアップを実行し、それに除外していることを忘れてしまいましたもの。すべての中で最も面白いのは、私がそうすることです:

rsync -avh --exclude={"/media/*","/dev/*","/proc/*","/sys/*","/tmp/*","/run/*","/mnt/*","/lost+found/*"}//my/backup/path 

私の除外とみなされます。

私はcrontabにbashを入れる必要がありますが、この理由から私はできません。

ご協力いただければ幸いです。

私のOSはDebian wheezyです。

+0

'sh -c 'echo {1,2,3}''出力 '1 2 3'または' {1,2,3} 'はありますか? 'sh 'が実際に' bash'であると確信していても、 'bash mybash.sh'を使ってください。 – chepner

+0

それを出してください:{1,2,3}、私はbashをテストしましょう。 – frdf

+0

hashbang行がオフです: '#!/ bin/bash'の代わりに'#!bin/bash' –

答えて

1

bash(おそらくdash)以外のスクリプトを実行していますが、中括拡張は認識されません。明示的:

bash mybash.sh 

しかし、bashにおけるブレース展開は、主に対話的な使用のためのショートカットとして意味しています。スクリプトを書いている場合は、単に明示的で(テキストエディタは、それを簡単にすべきである):

#!/bin/sh 
rsync -avh \ 
    --exclude "/media/*" \ 
    --exclude "/dev/*" \ 
    --exclude "/proc/*" \ 
    --exclude "/sys/*" \ 
    --exclude "/tmp/*" \ 
    --exclude "/run/*" \ 
    --exclude "/mnt/*" \ 
    --exclude "/lost+found/*" \ 
//my/backup/path 

は今、あなたはそれがPOSIXに準拠している限り、シェルスクリプトを実行することを心配する必要はありません。

実際にbash機能を使用する場合は、中括拡張の代わりに配列を使用することをおすすめします。将来的には読みやすく、編集しやすくなります。

#!/bin/bash 
exclusions=(
    --exclude "/media/*" 
    --exclude "/dev/*" 
    --exclude "/proc/*" 
    --exclude "/sys/*" 
    --exclude "/tmp/*" 
    --exclude "/run/*" 
    --exclude "/mnt/*" 
    --exclude "/lost+found/*" 
) 
rsync -avh "${exclusions[@]}"//my/backup/path 
関連する問題