以下のシェルでexcludeが適応されません。


#!/bin/bash
EXCLUDE=" --exclude 'images/' "
ALT="ssh -i id_rsa "
RSYNC='rsync -avn --progress --bwlimit=1000 '
$RSYNC $EXCLUDE -e "$ALT" user@hostname:/var/www/html/hostname .

そのかわり以下のように記述すればexcludeが適応されました。

$RSYNC --exclude 'images/' -e "$ALT" user@hostname:/var/www/html/hostname .

どのような原因がありますでしょうか。

よろしくお願いします。

回答の条件
  • 1人5回まで
  • 登録:
  • 終了:2013/05/29 18:05:08
※ 有料アンケート・ポイント付き質問機能は2023年2月28日に終了しました。

ベストアンサー

id:a-kuma3 No.1

回答回数4973ベストアンサー獲得回数2154

ポイント100pt
EXCLUDE=" --exclude 'images/' "
    ...
$RSYNC $EXCLUDE -e "$ALT" user@hostname:/var/www/html/hostname .

images/ をくくっているシングルクォートがシェル (bash) のパラメータ置換の対象にならないので、rsync コマンドは --exclude のパラメータとしてシングルクォート付きの 'images/' を受け取る。
シングルクォートがディレクトリ名についたディレクトリは存在してないから、--exclude の指定が効いてないように見える。

こんなシェルスクリプトを動かしてみると、理解できるかもしれない。

#!/bin/bash

sub () {
    echo $#
    echo $*
}

EXCLUDE=" --exclude 'images/' "

sub $EXCLUDE
sub --exclude 'images/'
sub "$EXCLUDE"
eval "sub $EXCLUDE"

bash に -x オプションをつけて実行すると、もっと理解が深まるかも。



もうひとつ、分かりやすい例を。
シングルクォートを含んだメッセージを echo で表示したいときには、どう書く?

echo "That's right."

コメントはまだありません

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

回答リクエストを送信したユーザーはいません