Reputation: 33
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?
Upvotes: 3
Views: 4066
Reputation: 437428
Use the array approach and double-quote the array reference:
RSYNCOPTS=(-ahz --delete '--filter=: .rsync-filter')
rsync "${RSYNCOPTS[@]}" source/ destination/
Upvotes: 10