'Bash -c' এ যুক্তি যুক্ত করুন


22

বলি যে আমি এইভাবে বাশের মাধ্যমে একটি কমান্ড চালাতে চাই:

/bin/bash -c "ls -l"

বাশ ম্যান পৃষ্ঠা অনুসারে, আমি এটি এটির মতো চালাতেও পারি:

#               don't process arguments after this one
#               |   pass all unprocessed arguments to command
#               |   |
#               V   V
/bin/bash -c ls -- -l

এটি কাজ করে না বলে মনে হচ্ছে (এটি উপেক্ষা করা বলে মনে হচ্ছে)। আমি কি কিছু ভুল করছি, বা আমি ম্যান পেজটি ভুল ব্যাখ্যা করছি?

মানুষের কাছ থেকে প্রাসঙ্গিক উক্তি:

যদি -c বিকল্প উপস্থিত থাকে তবে কমান্ডগুলি স্ট্রিং থেকে পঠিত হবে। স্ট্রিংয়ের পরে যদি আর্গুমেন্ট থাকে তবে তাদের অবস্থানিক পরামিতিগুলিতে বরাদ্দ করা হয়,, 0 দিয়ে শুরু করে।

এবং

এ - বিকল্পগুলির শেষের ইঙ্গিত দেয় এবং পরবর্তী বিকল্প প্রক্রিয়াটিকে অক্ষম করে। - এর পরে যে কোনও যুক্তি ফাইলের নাম এবং যুক্তি হিসাবে বিবেচিত হবে।

উত্তর:


33

আপনি ম্যান পেজটি ভুল ব্যাখ্যা করছেন। প্রথমত, --বিকল্পগুলির শেষের সংকেত সম্পর্কিত অংশটি আপনি যা করার চেষ্টা করছেন তার সাথে অপ্রাসঙ্গিক। -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করা দ্রুত, সহজ এবং কম টাইপ করা হবে। এবং এটি নিরাপদে শেল মেটাচার্যাক্টর বা সাদা স্থান সম্বলিত ফাইলের নামগুলি পরিচালনা করবে কিনা তা নিশ্চিত করার জন্য আপনাকে কঠোর চিন্তা করতে হবে না।


3

আপনার উদ্দেশ্য কী তা আমি নিশ্চিত নই, তবে আপনি যদি কেবল একটি রুবে গোল্ডবার্গ মেশিন তৈরির চেষ্টা করছেন - "খুব সহজেই খুব সাধারণ কাজ সম্পাদন করার জন্য ইচ্ছাকৃতভাবে অতিরিক্ত ইঞ্জিনিয়ারিং বা ওভারডোন সম্পন্ন একটি বৈকল্পিক, আবিষ্কার, ডিভাইস বা যন্ত্রপাতি জটিল ফ্যাশন ”- তারপরে চেষ্টা করুন

sh -c 'ls $0' -l

অথবা

sh -c 'ls $1' supercalifragilisticexpialidocious -l

অথবা এমনকি

sh -c 'ls -$0' l

গডলিজিকের উত্তর থেকে কীভাবে এগুলি কাজ করে তা আপনার বুঝতে সক্ষম হওয়া উচিত।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.