6

私は bash スクリプトを書いています。これは、一部で ssh 経由でファイルを rsync します。残念ながら、rsync オプションを変数として保持するという問題に直面しています。以下をご覧ください。

    # variables
    directory="/etc"
    backupDirectory="/backup"
    incrementalBackup="/incremental"
    options="-a -e 'ssh -p 10022' -b --backup-dir=$incrementalBackup --delete"
    # rsync
    rsync $options user@server:$directory $backupDirectory

残念ながら、上記のスクリプトは rsync エラーで失敗します:

    Unexpected remote arg: user@server:/etc
    rsync error: syntax or usage error (code 1) at main.c(1201) [sender=3.0.6]

スクリプトのデバッグ中に私が見たのは、ssh オプション ('ssh -p 10022') が rsync オプションとして扱われるという事実です。問題は、これらの追加の ssh 設定を rsync に正しく渡す方法です。事前にヒントをありがとう。

4

2 に答える 2

14

配列を使用します。それが彼らがに追加された理由bashです:

# variables
directory="/etc"
backupDirectory="/backup"
incrementalBackup="/incremental"
options=(-a -e 'ssh -p 10022' -b --backup-dir="$incrementalBackup" --delete)
# rsync
rsync "${options[@]}" user@server:"$directory" "$backupDirectory"

eval安全に使用できるオプションではありません。意図した引用を評価するだけでなく、あらゆるコードを評価します。現在の状況ではうまくoptionsいくかもしれませんが、 の値を変更すると、予期しない結果が生じる可能性があります。一般に、必要のevalないときに使用する習慣をつけるのはお勧めできません。

于 2013-10-07T12:46:35.733 に答える
4

を使用しevalます。試す:

eval rsync $options user@server:$directory $backupDirectory
于 2013-10-07T08:20:09.053 に答える