একটি কমান্ড মোড়ানো যা অন্য কমান্ডের জন্য একক এবং ডাবল উদ্ধৃতি অন্তর্ভুক্ত করে


10

আমি সম্প্রতি ঘড়ি সম্পর্কে শিখেছি , তবে এটি অপেক্ষাকৃত পরিশীলিত আদেশের সাথে কাজ করতে সমস্যা হচ্ছে।

উদাহরণস্বরূপ, আমি প্রতি তিন সেকেন্ডে watchনিম্নলিখিত কমান্ডটি চালাতে বলব * :zsh

for x in `command_1 | grep keyword | cut -d' ' -f1`; do command_2 "word[word=number]" $x; done

যেমন আপনি দেখতে পাচ্ছেন উপরের লাইনটিতে অন্যান্য বিশেষ অক্ষরের মধ্যে একক উদ্ধৃতি, ডাবল উদ্ধৃতি অন্তর্ভুক্ত রয়েছে।

সুতরাং আমি চেষ্টা করেছি:

watch -n 3 "for x in `my_command | grep keyword | cut -d' ' -f1`; do command2 "rusage[mem=7000]" $x; done"

তবে আমি পেয়েছিলাম:

x এর জন্য কোনও মিল খুঁজে পাওয়া যায় নি! @ # $ # ....; সম্পন্ন

আমি সাফল্য ছাড়াই অন্য সংমিশ্রণ চেষ্টা করেছি। এই চেষ্টাগুলির মধ্যে একটি এখানে:

watch -n 3 "for x in $(bjobs -w | grep pre_seg | cut -d' ' -f1); do bmod -R "rusage[mem=7000]" $x; done"

যা একই ধরণের ত্রুটির ফলস্বরূপ।

এই ধারণাটি কীভাবে তৈরি করবেন?


* আমি যে সমাধানগুলিতে কাজ করি সেগুলিতেও ছেদ করা হবেbash

উত্তর:


16

সাধারণ টিপ: আপনার যদি দুটি স্তরের বাসা বাঁধে তবে অভ্যন্তরীণ কমান্ডের একক উদ্ধৃতি ব্যবহার করা এড়িয়ে চলুন এবং বাইরের কমান্ডের চারপাশে একক উদ্ধৃতি ব্যবহার করুন।

অতিরিক্ত টিপ: `…` কোডটি কার্যকর করতে ব্যাকটিক্স ব্যবহার করবেন না - পরিবর্তে এর $(…)চারপাশে ব্যবহার করুন । ডলার-বন্ধনীগুলি ডিভিআইআইএম ('আমি যা বোঝাতে চাইছি তা কর') যখন নেস্টেড কোটে আসে; ব্যাককোয়টে আরকেন, শেল-নির্ভর নিয়ম রয়েছে।

watch -n 3 'for x in $(my_command | grep keyword | cut -d" " -f1); do command2 "rusage[mem=7000]" "$x"; done'

যদি আপনার একক-উদ্ধৃত কমান্ডের মধ্যে একক উদ্ধৃতিগুলির প্রয়োজন হয়, আপনি ব্যবহার করতে পারেন '\''। এই চারটি চরিত্রটিকে একক উদ্ধৃতিগুলির মধ্যে একটি একক উদ্ধৃতি উদ্ধৃত করার উপায় হিসাবে ভাবেন, যদিও প্রযুক্তিগতভাবে বলতে গেলে এটি একক-উদ্ধৃত স্ট্রিংয়ের শেষে হিসাবে নির্মিত হয়েছে, একটি আক্ষরিক একক উদ্ধৃতি সংযোজন করুন, এবং একটি নতুন একক-উদ্ধৃত স্ট্রিং শুরু করুন (এখনও যুক্ত করা হয়েছে বর্তমান শব্দ)।

আরও জটিল ক্ষেত্রে, হয় কঠোরতার সাথে উদ্ধৃতিগুলি গণনা করুন বা অস্থায়ী ভেরিয়েবলগুলি সংজ্ঞায়িত করুন।

cmd='for x in $(my_command | grep keyword | cut -d" " -f1); do command2 "rusage[mem=7000]" "$x"; done'
watch_cmd='watch -n 3 "$cmd"'

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

ওহ, এবং উপায় দ্বারা নোট করুন যে zsh এ নয়, watchআপনার আদেশটি কার্যকর করবে sh। আপনি যদি zsh এ কমান্ডটি প্রয়োগ করতে চান তবে আপনার চালনা করা দরকার

watch -n 3 -x zsh -c "$cmd"

ডেবিয়ান / উবুন্টুতে এবং

export cmd
watch -n 3 'exec zsh -c "$cmd"'

(আরও উদ্ধৃতি!) অন্য কোথাও।


ধন্যবাদ @ গিলিস এটা খুব সহায়ক ছিল। মজার ব্যাপারটি আমার মেশিনে ন্যাশনাল বিকল্পগুলি watchনিয়ে আসে না । আমি এটি অনলাইনে সন্ধান করেছি এবং তাদের উল্লেখ করা কোনও ম্যান পেজ খুঁজে পাইনি। এই বিকল্পগুলি কি করতে পারে? -x-c
অ্যামিলিও ওয়াজকেজ-রেইনা

1
@intrpc শেল দিয়ে কমান্ডটি পাস না করতে -xবলে watch। আমি সবেমাত্র জানতে পেরেছি যে এটি ডেবিয়ান / উবুন্টুর সাথে সুনির্দিষ্ট, যদিও এটি তেমন নির্দেশিত নয়। -cপ্রেরণ করা zsh, না করার watch
গিলস 'অশুভ হওয়া বন্ধ করুন'

@ গিলিস আমার -xএবং মাইন্ডোতে -execবিকল্পগুলি উভয়ই বিদ্যমান watch, সুতরাং এটি অবশ্যই ডেবিয়ান-নির্দিষ্ট নয়। আপনি অন্য কিছু সংস্করণ সঙ্গে তুলনা করতে পারেন watch? খনি প্রোপস প্যাকেজ থেকে আসে ।
rozcietrzewiacz

1
@rozcietrzewiacz watchথেকে আসে procpsখুব ডেবিয়ান উপর। সরকারী উৎস নেই --exec। ডেবিয়ানের প্যাকেজ (এবং উবুন্টু সহ ডেরিভেটিভস) একটি ডেবিয়ান-নির্দিষ্ট প্যাচে বিকল্প যুক্ত করেছে ( watch_exec_beep.patchএটি বাগ # 410967 থেকে "মর্টিস ওয়াচ এক্সিকিচ প্যাচ" )। জেন্টু একই ধরণের প্যাচ গ্রহণ করতে পারে।
গিলস 'অসন্তুষ্ট হওয়া বন্ধ করুন'
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.