Pregunta

This is similar to a few other rsync bash variable questions I've seen on stackoverflow, but none of those answers have solved my specific problem. I'd like to run the following command in a bash script, but have the rsync options contained in a variable:

rsync -ahz --delete --filter=': .rsync-filter' source/ destination/

I note that bash actually interprets this as follows:

+ rsync -ahz --delete '--filter=: .rsync-filter' source/ destination/

Which also works fine in rsync.

When I try to put these values in variables I see the following commands being run:

RSYNCOPTS="-ahz --delete --filter=: .rsync-filter"
rsync  ${RSYNCOPTS} source/ destination/
+ RSYNCOPTS='-ahz --delete --filter=: .rsync-filter'
+ rsync -ahz --delete --filter=: .rsync-filter source/ destination/
unexpected end of filter rule: :

RSYNCOPTS="-ahz --delete --filter=': .rsync-filter'"
rsync  ${RSYNCOPTS} source/ destination/
+ RSYNCOPTS='-ahz --delete --filter='\'': .rsync-filter'\'''
+ rsync -ahz --delete '--filter='\'':' '.rsync-filter'\''' source/ destination/
Unknown filter rule: `':'

RSYNCOPTS="-ahz --delete '--filter=: .rsync-filter'"
rsync  ${RSYNCOPTS} source/ destination/
+ RSYNCOPTS='-ahz --delete '\''--filter=: .rsync-filter'\'''
+ rsync -ahz --delete ''\''--filter=:' '.rsync-filter'\''' source/ destination/
Unexpected local arg: .rsync-filter'

RSYNCOPTS='-ahz --delete --filter=: .rsync-filter'
rsync  ${RSYNCOPTS} source/ destination/
+ RSYNCOPTS='-ahz --delete --filter=: .rsync-filter'
+ rsync -ahz --delete --filter=: .rsync-filter source/ destination/
unexpected end of filter rule: :

RSYNCOPTS='-ahz --delete --filter=": .rsync-filter"'
rsync  ${RSYNCOPTS} source/ destination/
+ RSYNCOPTS='-ahz --delete --filter=": .rsync-filter"'
+ rsync -ahz --delete '--filter=":' '.rsync-filter"' source/ destination/
Unknown filter rule: `":'

RSYNCOPTS='-ahz --delete "--filter=: .rsync-filter"'
rsync  ${RSYNCOPTS} source/ destination/
+ RSYNCOPTS='-ahz --delete "--filter=: .rsync-filter"'
+ rsync -ahz --delete '"--filter=:' '.rsync-filter"' source/ destination/
Unexpected local arg: .rsync-filter"

And I even tried a few with arrays to see if that helped:

RSYNCOPTS=(-ahz --delete '--filter=: .rsync-filter')
rsync  ${RSYNCOPTS[@]} source/ destination/
+ RSYNCOPTS=(-ahz --delete '--filter=: .rsync-filter')
+ rsync -ahz --delete --filter=: .rsync-filter source/ destination/
unexpected end of filter rule: :

RSYNCOPTS=(-ahz --delete '--filter=": .rsync-filter"')
rsync  ${RSYNCOPTS[@]} source/ destination/
+ RSYNCOPTS=(-ahz --delete '--filter=": .rsync-filter"')
+ rsync -ahz --delete '--filter=":' '.rsync-filter"' source/ destination/
Unknown filter rule: `":'

RSYNCOPTS=(-ahz --delete "--filter=': .rsync-filter'")
rsync  ${RSYNCOPTS[@]} source/ destination/
+ RSYNCOPTS=(-ahz --delete "--filter=': .rsync-filter'")
+ rsync -ahz --delete '--filter='\'':' '.rsync-filter'\''' source/ destination/
Unknown filter rule: `':'

So what am I missing?

¿Fue útil?

Solución

Use the array approach and double-quote the array reference:

RSYNCOPTS=(-ahz --delete '--filter=: .rsync-filter')
rsync  "${RSYNCOPTS[@]}" source/ destination/
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top