2017-01-16 8 views
1

を引用:$ OPTIONS変数に関連すると思わものの、のRsyncと、私は次のようにbashスクリプトを書いた

SRC="dist_serv:$HOME/www/" 
DEST="$HOME/www/" 
OPTIONS="--exclude 'file.php'" 
rsync -Cavz --delete $OPTIONS $SRC $DEST 

rsyncが失敗し、私はその理由を把握することはできません(私は削除した場合、それは動作しますそれ)。私はバックスラッシュ(他の多くのものの中で)でスペースをエスケープしようとしましたが、うまくいかなかった。 エラーメッセージは次のとおりです。

rsync: mkdir "/home/xxx/~/public_html/" failed: No such file or directory (2) 

私は別のエラー(私の変数$ OPTIONSの「未知のオプションを」)スロー変数を、引用してみました:

rsync: --exclude 'xxx': unknown option 
rsync error: syntax or usage error (code 1) at main.c(1422) [client=3.0.6] 

答えて

0

あなたが前に$を置くべきではありません変数名に値を代入するときに使用します。 SRCは変数で、$SRCはそれが展開される値です。

さらに、~は、引用符で囲んだときにホームディレクトリのパスに展開されません。この変数のように振る舞い、~では実行されないため、スクリプト内では$HOMEを使用する方が一般的に適しています。

は、必ず変数の展開を引用:

rsync -Cavz --delete "$OPTIONS" "$SRC" "$DEST" 

しないように(そこめったにれる)いくつかの理由がある場合を除きます。それ以外の場合、シェルは単語分割を実行します。

ユーザー@Fredは(=に注意してください)あなたは(下のコメント欄で中)$OPTIONSの周りに二重引用符を使用することはできませんが、あなたはOPTIONS='--exclude="file.php"'を使用している場合、それはOKであることを指摘しています。

+0

OPTIONS変数には2つの単語が含まれているため、引用符で囲まれていないため、コマンドを解釈するときに引用符で区切られます(単一の文字列と見なされます)。この場合、OPTIONSの引用符は空白を含まないため動作しませんが、一般的な解決策ではありません。 – Fred

+0

はい、もちろんです:変数の割り当て!私の質問を編集する... – mrtnmgs

+1

@immicile質問に 'rsync'から得た正確なエラーメッセージを書くことができれば、それは大いに役立ちます! – Kusalananda

0

私が大切に思っている手法の1つは、位置パラメータを使用してオプションのリストを扱いやすくすることです。

変数内にオプションを入れた場合(たとえば、OPTIONS変数)、値の中に引用符を含める方法を見つける必要があり、変数を参照するときは引用符を省略する必要があります。それはうまくいきますが、あなたは常に失敗をデバッグするのが難しいから1つのタイプミスです。

代わりに、以下を試してください。もちろん

set -- -Cavz --delete 
set -- "[email protected]" --exclude "file.php" 
set -- "[email protected]" "dist_serv:~/www/" 
set -- "[email protected]" "~/www/" 
rsync "[email protected]" 

が、この場合には、すべてが同じライン上かもしれないが、例えば、あなたが与えられたオプションを省略することができ、または選択した差分ファイルが動作するように、なるように多くの場合、条件式があるでしょうと。良いことは、特定の変数を参照する(または引用する)ことを避けるという魔法のおかげで、常に単一のコマンドラインで使用するのと同じ引用を使用することです。

実際の位置パラメータが途中で変化する場合は、それらを変数に配置するか、問題のある場所に触れることを避けるコンテキストを分離する関数を作成できます。

私はこのトリックを常時使用しています。私はコマンドにパラメータとして渡す値の中に問題を引き起こしているため、私の髪を引っ張るのをやめました。

同様の結果は、アレイを使用することによって達成することができる。

+0

これは素晴らしい回避策ですが、私のスクリプトはすでに位置パラメータを使用しており、上書きされてしまいます。 – mrtnmgs

+0

私は、位置パラメータを使わずに同様の結果をもたらす配列ベースのソリューションを追加しました。 – Fred

関連する問題