আপনি ম্যান পেজটি ভুল ব্যাখ্যা করছেন। প্রথমত, --
বিকল্পগুলির শেষের সংকেত সম্পর্কিত অংশটি আপনি যা করার চেষ্টা করছেন তার সাথে অপ্রাসঙ্গিক। -c
ওভাররাইড যে বিন্দু থেকে কমান্ড লাইন বাকি, তাই যে এটি আর যাচ্ছে কোন ব্যাপার এ সব ব্যাশ এর বিকল্প হ্যান্ডলিং মাধ্যমে, যার মানে হল --
কমান্ড মাধ্যমে গৃহীত হবে অপশন মার্কার একজন শেষ হিসাবে ব্যাশ দ্বারা পরিচালিত নয়।
দ্বিতীয় ভুলটি হ'ল অতিরিক্ত আর্গুমেন্টগুলি শেল প্রসেসের অবস্থানগত পরামিতি হিসাবে নির্ধারিত হয় যা কমান্ডের আর্গুমেন্ট হিসাবে পাস হয় না। সুতরাং, আপনি যা করার চেষ্টা করছেন তার মধ্যে একটি হিসাবে এটি করা যেতে পারে:
/bin/bash -c 'echo "$0" "$1"' foo bar
/bin/bash -c 'echo "$@"' bash foo bar
প্রথম ক্ষেত্রে, প্যারামিটারগুলি $0
এবং $1
স্পষ্টভাবে প্রতিধ্বনিত করা এবং দ্বিতীয় ক্ষেত্রে "$@"
"$ 0" ব্যতীত সমস্ত অবস্থানগত পরামিতি হিসাবে স্বাভাবিক হিসাবে প্রসারিত ব্যবহার করে । দ্রষ্টব্য যে সেক্ষেত্রে আমাদের পাশাপাশি কিছু ব্যবহার করতে হবে $0
; আমি $0
সাধারণত "বাশ" বেছে নিয়েছি যেহেতু সাধারণত এটিই হবে তবে অন্য কিছু কাজ করবে।
কারণ হিসাবে এটি এইভাবে সম্পন্ন হয়েছে, কেবলমাত্র আপনি যে কমান্ডটি তালিকাভুক্ত করেছেন তার সরাসরি যুক্তিগুলি পাস করার পরিবর্তে: নোট করুন যে "কমান্ড গুলি স্ট্রিং থেকে পড়া হয়", বহুবচন বলে। অন্য কথায়, এই স্কিম আপনাকে করতে দেয়:
/bin/bash -c 'mkdir "$1"; cd "$1"; touch "$2"' bash dir file
তবে মনে রাখবেন যে আপনার আসল লক্ষ্যটি অর্জনের একটি আরও ভাল উপায় এর env
পরিবর্তে ব্যবহার করা যেতে পারে bash
:
/usr/bin/env -- "ls" "-l"
শেল সরবরাহ করে এমন বৈশিষ্ট্যগুলির যদি আপনার প্রয়োজন না হয় তবে এটি ব্যবহার করার কোনও কারণ নেই - এক্ষেত্রে ব্যবহার env
করা দ্রুত, সহজ এবং কম টাইপ করা হবে। এবং এটি নিরাপদে শেল মেটাচার্যাক্টর বা সাদা স্থান সম্বলিত ফাইলের নামগুলি পরিচালনা করবে কিনা তা নিশ্চিত করার জন্য আপনাকে কঠোর চিন্তা করতে হবে না।