আমি একটি স্ক্রিপ্ট লিখেছিলাম যা আমার পক্ষে উক্তি সহ সেই যুক্তি উত্পন্ন করতে পারে
শেলটির জন্য যদি আউটপুটটি সঠিকভাবে উদ্ধৃত হয় এবং আপনি আউটপুটকে বিশ্বাস করেন তবে আপনি এটি চালাতে eval
পারেন।
ধরে নিই যে আপনার কাছে একটি শেল রয়েছে যা অ্যারে সমর্থন করে, আপনার আর্গুমেন্টগুলি সংরক্ষণ করার জন্য এটি ব্যবহার করা ভাল।
যদি ./gen_args.sh
আউটপুট এর মতো উত্পাদিত হয় 'foo bar' '*' asdf
, তবে আমরা ফলাফলগুলির সাথে eval "args=( $(./gen_args.sh) )"
ডাকা একটি অ্যারে তৈরি করতে দৌড়াতে পারি args
। যে তিনটি উপাদান হবে foo bar
, *
, asdf
।
"${args[@]}"
অ্যারে উপাদানগুলি পৃথকভাবে প্রসারিত করতে আমরা যথারীতি ব্যবহার করতে পারি :
$ eval "args=( $(./gen_args.sh) )"
$ for var in "${args[@]}"; do printf ":%s:\n" "$var"; done
:foo bar:
:*:
:asdf:
(উদ্ধৃতি দ্রষ্টব্য। "${array[@]}"
যেমন স্বতন্ত্র আর্গুমেন্ট অপরিবর্তিত সব উপাদান বিস্তৃতি। কোট ছাড়া অ্যারে উপাদানের শব্দ বিভাজন সাপেক্ষে। দেখুন উদাঃ BashGuide উপর অ্যারেগুলির পৃষ্ঠা ।)
যাইহোক , eval
আনন্দের সাথে কোনও শেল বিকল্পগুলি চালিত করবে, সুতরাং $HOME
আউটপুটটি আপনার হোম ডিরেক্টরিতে প্রসারিত হবে এবং একটি কমান্ড প্রতিস্থাপনটি শেল চলমান অবস্থায় একটি কমান্ড চালিত করবে eval
। এর আউটপুট "$(date >&2)"
একটি একক খালি অ্যারে উপাদান তৈরি করবে এবং স্টডআউটে বর্তমান তারিখটি মুদ্রণ করবে। gen_args.sh
নেটওয়ার্কের উপরের অন্য হোস্টের মতো, অন্যান্য ব্যবহারকারীর দ্বারা নির্মিত ফাইলের নামগুলির মতো কিছু অবিশ্বস্ত উত্স থেকে ডেটা পাওয়া গেলে এটি উদ্বেগজনক । আউটপুটটিতে যথেচ্ছ কমান্ড অন্তর্ভুক্ত থাকতে পারে। (যদি get_args.sh
নিজেই দূষিত হয় তবে এর কোনও কিছুর আউটপুট দেওয়ার দরকার পড়েনি, এটি সরাসরি দূষিত কমান্ডগুলি চালাতে পারে))
শেল কোটিংয়ের বিকল্প, যা ইওল ছাড়াই পার্স করা শক্ত, আপনার স্ক্রিপ্টের আউটপুটে পৃথক হিসাবে অন্য কোনও চরিত্র ব্যবহার করা হবে। আপনার আসল যুক্তিগুলির প্রয়োজন হয় না এমন একটি বাছাই করা দরকার।
আসুন চয়ন করুন #
, এবং স্ক্রিপ্ট আউটপুট আছে foo bar#*#asdf
। এখন আমরা কমান্ডের আউটপুটটিকে আর্গুমেন্টে বিভক্ত করতে উদ্ধৃত কমান্ড সম্প্রসারণ ব্যবহার করতে পারি ।
$ IFS='#' # split on '#' signs
$ set -f # disable globbing
$ args=( $( ./gen_args3.sh ) ) # assign the values to the array
$ for var in "${args[@]}"; do printf ":%s:\n" "$var"; done
:foo bar:
:*:
:asdf:
আপনি IFS
যদি স্ক্রিপ্টের অন্য কোথাও শব্দ বিভাজনের উপর নির্ভর করে ( unset IFS
এটিকে ডিফল্ট হিসাবে তৈরি করার জন্য কাজ করা উচিত) এবং set +f
আপনি যদি পরে গ্লোব্বিং ব্যবহার করতে চান তবে ব্যবহার করতে হবে later
আপনি যদি বাশ বা অ্যারে রয়েছে এমন কোনও শেল ব্যবহার না করে থাকেন তবে আপনি তার জন্য অবস্থানগত পরামিতি ব্যবহার করতে পারেন। প্রতিস্থাপন args=( $(...) )
সঙ্গে set -- $(./gen_args.sh)
এবং ব্যবহার "$@"
পরিবর্তে "${args[@]}"
তারপর। (এখানেও আপনার চারপাশে উদ্ধৃতি প্রয়োজন "$@"
, অন্যথায় অবস্থানগত পরামিতিগুলি শব্দ বিভাজনের সাপেক্ষে))
eval
এটি ব্যবহার করা যেতে পারে তবে এটি সাধারণত প্রস্তাবিত নয়।xargs