আমি কীভাবে কোনও কমান্ডের কোট সমেত বাশ ভেরিয়েবল (স্ট্রিং) ব্যবহার করব?


45

ব্যর্থতা, সরলীকৃত উদাহরণ:

FLAGS='--archive --exclude="foo bar.txt"'
rsync $FLAGS dir1 dir2

আমাকে উদ্ধৃতিগুলি অন্তর্ভুক্ত করতে হবে যেন কমান্ডটি এর মতো ছিল:

rsync --archive --exclude="foo bar.txt" dir1 dir2

উত্তর:


55

সংক্ষিপ্ত উত্তর: বাশফ্যাঙ্ক # 50 দেখুন ("আমি একটি চলকটিতে একটি কমান্ড দেওয়ার চেষ্টা করছি, কিন্তু জটিল ক্ষেত্রে সবসময় ব্যর্থ হয়!")।

দীর্ঘ উত্তর: কমান্ডগুলি (বা কমান্ডের কিছু অংশ) ভেরিয়েবলগুলিতে স্থাপন করা এবং তারপরে সেগুলি অক্ষত অবস্থায় ফিরিয়ে আনা জটিল। শেলটি যখন কমান্ড লাইনে একটি ভেরিয়েবল প্রসারিত করে, ভেরিয়েবলটি যদি ডাবল-কোটে থাকে তবে এটি পার্স করা হয়নি; যদি এটি উদ্ধৃতিগুলিতে না থাকে, তবে এর ফাঁকা স্থানগুলি আর্গুমেন্টের বিরতি হিসাবে পার্স করা হয়, তবে উদ্ধৃতিগুলি এবং পলায়নগুলি পার্স করা যায় না। উভয় ক্ষেত্রেই ভেরিয়েবলের মানতে উদ্ধৃতি স্থাপন কার্যকর হয় না।

সাধারণত, এই ধরণের জিনিসটি করার সর্বোত্তম উপায় হ'ল একটি সাধারণ পাঠ্য পরিবর্তকের পরিবর্তে অ্যারে ব্যবহার করা হয়:

FLAGS=(--archive --exclude="foo bar.txt")
rsync "${FLAGS[@]}" dir1 dir2

পবিত্র জেজুস এটি কাজ করে!
স্লাওমির


-2

আমি সমস্যাটি দেখতে পাচ্ছি না:

$ FLAGS='--archive --exclude="foo bar.txt"'
$ echo $FLAGS
--archive --exclude="foo bar.txt"

হতে পারে আপনাকে আবার মানটি উদ্ধৃত করতে হবে:

$ rsync "$FLAGS" dir1 dir2

5
echoআপনি কি মনে করেন তা দেখাচ্ছে না। printargs() { printf "'%s' " "$@"; echo; }; printargs $FLAGS; printargs "$FLAGS"এই বিকল্পগুলির কোনওটি কেন কাজ করে না তা দেখার চেষ্টা করুন।
গর্ডন ডেভিসন
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.