ব্যর্থতা, সরলীকৃত উদাহরণ:
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
উত্তর:
সংক্ষিপ্ত উত্তর: বাশফ্যাঙ্ক # 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"
এই বিকল্পগুলির কোনওটি কেন কাজ করে না তা দেখার চেষ্টা করুন।