असफल, सरलीकृत उदाहरण:
FLAGS='--archive --exclude="foo bar.txt"'
rsync $FLAGS dir1 dir2
मुझे उद्धरण शामिल करने की आवश्यकता है जैसे कि कमांड इस तरह थी:
rsync --archive --exclude="foo bar.txt" dir1 dir2
असफल, सरलीकृत उदाहरण:
FLAGS='--archive --exclude="foo bar.txt"'
rsync $FLAGS dir1 dir2
मुझे उद्धरण शामिल करने की आवश्यकता है जैसे कि कमांड इस तरह थी:
rsync --archive --exclude="foo bar.txt" dir1 dir2
जवाबों:
संक्षिप्त उत्तर: BashFAQ # 50 देखें ("मैं एक चर में एक कमांड डालने की कोशिश कर रहा हूं, लेकिन जटिल मामले हमेशा विफल होते हैं!")।
दीर्घ उत्तर: आदेशों (या आदेशों के कुछ हिस्सों) को चर में डालना और फिर उन्हें वापस बाहर निकालना जटिल है। जब शेल कमांड लाइन पर एक चर का विस्तार करता है, यदि चर डबल-कोट्स में था तो इसे पार्स नहीं किया गया है; यदि यह उद्धरणों में नहीं था, तो तर्क विच्छेद के रूप में इसमें रिक्त स्थान होते हैं, लेकिन उद्धरण और पलायन पार्स नहीं होते हैं। या तो मामले में, चर के मूल्य में उद्धरण डालने से कुछ भी उपयोगी नहीं होता है।
आमतौर पर, इस तरह का काम करने का सबसे अच्छा तरीका एक साधारण पाठ चर के बजाय एक सरणी का उपयोग करना है:
FLAGS=(--archive --exclude="foo bar.txt")
rsync "${FLAGS[@]}" dir1 dir2
eval एक और विकल्प है:
$ x="'a b'"
$ printf '%s,%s' $x
'a,b'
$ eval printf '%s,%s' $x
a b
यह भी देखें:
मैं समस्या नहीं देखता:
$ FLAGS='--archive --exclude="foo bar.txt"'
$ echo $FLAGS
--archive --exclude="foo bar.txt"
शायद आपको फिर से मूल्य उद्धृत करने की आवश्यकता है:
$ rsync "$FLAGS" dir1 dir2
echo
यह नहीं दिखा रहा है कि आपको क्या लगता है। printargs() { printf "'%s' " "$@"; echo; }; printargs $FLAGS; printargs "$FLAGS"
यह देखने की कोशिश करें कि इनमें से कोई भी विकल्प क्यों काम नहीं करता है।