опция rsync в переменной - PullRequest
       22

опция rsync в переменной

4 голосов
/ 13 сентября 2010

Я хочу поместить параметр команды rsync в переменную, чтобы я мог повторно использовать ее для других команд rsync. Вот что я пробовал, но это не сработало.

roption="-a --recursive --progress --exclude='class' --delete --exclude='exclude' --exclude='.svn' --exclude='.metadata' --exclude='*.class'"
rsync "$roption" /media/CORSAIR/workspace ~/

Может ли тело помочь мне разобраться в проблеме?

Спасибо

Ответы [ 3 ]

15 голосов
/ 13 сентября 2010

Использовать массивы оболочки. Они чрезвычайно полезны, если вы хотите формировать строки, используя escape-коды, и иметь буквально то, что напечатано. Плюс охрана.

roption=(
    -a
    --recursive
    --progress
    --exclude='class'
    --delete
    --exclude='exclude'
    --exclude='.svn'
    --exclude='.metadata'
    --exclude='*.class'
)

rsync "${roption[@]}" /media/CORSAIR/workspace ~/

Вы даже можете добавить к ним:

if [ "$VERBOSE" -ne 0 ]; then
    roption+=(--verbose)
fi
1 голос
/ 13 сентября 2010

Поскольку ваш $roption представляет более одного аргумента, вы должны использовать $roption, а не "$roption".

Конечно, использовать скаляр для хранения нескольких значений просто неправильно. Если вы используете bash, рассмотрите возможность использования массива:

roptions=(-a --recursive --progress --exclude='class' --delete --exclude='exclude' --exclude='.svn' --exclude='.metadata' --exclude='*.class')
rsync "${roptions[@]}" /media/CORSAIR/workspace ~
0 голосов
/ 13 сентября 2010

Вы можете попробовать команду 'eval', которая попросит оболочку проанализировать командную строку один раз, прежде чем eval сможет ее интерпретировать:

roption="-a --recursive --progress --exclude='class' --delete --exclude='exclude' --exclude='.svn' --exclude='.metadata' --exclude='*.class'" 

eval "rsync $roption /media/CORSAIR/workspace ~"
...