ব্যাশের কোনও ইউটিলিটি প্রোগ্রামে শৃঙ্খলাবদ্ধ কলগুলি প্যারামিটারাইজ করুন


12

আমার কাছে একটি কালো বাক্স ইউএনআইএক্স প্রোগ্রাম রয়েছে যা ব্যাশ শেলের সাথে ব্যবহৃত হয় যা স্টিডিনের ডেটা কলামগুলি পড়ে, সেগুলি প্রক্রিয়া করে (একটি স্মুথিং এফেক্ট প্রয়োগ করে) তারপরে স্টডআউটে আউটপুট দেয়। আমি এটি ইউনিক্স পাইপ দ্বারা ব্যবহার করি, পছন্দ করি

generate | smooth | plot  

আরও মসৃণ করার জন্য, আমি মসৃণটির পুনরাবৃত্তি করতে পারি, সুতরাং এটি বাশ কমান্ড লাইন থেকে অনুরোধ করা হবে

generate | smooth | smooth | plot   

অথবা এমনকি

generate | smooth | smooth | smooth | smooth | smooth | smooth | smooth | smooth | smooth | smooth | plot

এটি অস্বাস্থ্যকর হচ্ছে। আমি smoothএর জন্য আউটপুটটি পাইপ করতে সক্ষম হবার জন্য বাশ র‍্যাপার তৈরি করতে চাই এবং তার আউটপুটটি সরাসরি smoothএকটি স্বেচ্ছাসেবী সংখ্যার বারে একটি নতুন উদাহরণে ফিড করতে চাই, এরকম কিছু

generate | newsmooth 5 | plot

পরিবর্তে

generate | smooth | smooth | smooth | smooth | smooth | plot

আমার প্রথম প্রয়াসটি বাশ স্ক্রিপ্ট ছিল যা বর্তমান ডিরেক্টরিতে টেম্প ফাইল তৈরি করে সেগুলি মুছে ফেলেছিল, তবে লেখার অ্যাক্সেস সহ আমি কোনও ডিরেক্টরিতে না থাকাকালীন এটি কুশ্রী হয়ে উঠল এবং বাধা দেওয়ার সময় আবর্জনা ফাইলও রেখে দিয়েছিল।

smoothপ্রোগ্রামটিতে কোনও যুক্তি নেই ।

কলগুলির সংখ্যাটি প্যারামিটারাইজ করার জন্য এই জাতীয় প্রোগ্রামকে "মোড়ানো" করার আরও কি দুর্দান্ত উপায় আছে?


1
আমি আশা করি আপনার উদাহরণটি প্রশ্নের প্রয়োজনের জন্য জোরপূর্বক মামলা এবং আসল প্রয়োজন নয়
arielnmz

উত্তর:


18

আপনি এটি একটি পুনরাবৃত্ত ফাংশন মোড়ানো করতে পারে:

smooth() {
  if [[ $1 -gt 1 ]]; then # add another call to function
    command smooth | smooth $(($1 - 1)) 
  else
    command smooth # no further 
  fi
}

আপনি এটি হিসাবে ব্যবহার করবে

generate | smooth 5 | plot

যা সমান হবে

generate | smooth | smooth | smooth | smooth | smooth | plot

এটি নিখুঁত, প্রয়োজন হিসাবে ঠিক আচরণ করে। এবং এখন আমি বাশ "কমান্ড" কীওয়ার্ড সম্পর্কে শিখেছি।
ডায়ান উইলবার


5

আপনি যে পরিমাণ smoothকমান্ড চান তা যতটা কমাতে টাইপ করতে পারলে শেলের কমা-বিচ্ছিন্ন ব্রেস এক্সপেনশন আপনি নিতে পারেন।

টি এল; ডাঃ

আপনার নমুনা কেসের পুরো কমান্ড লাইনটি হ'ল:

generate | eval 'smooth |'{,,,,} plot

বিঃদ্রঃ:

  • আপনি আরও বা কম সংখ্যার পুনরাবৃত্তি চাইলে কমা যোগ করুন বা সরান smooth |
  • এর |আগে কোনও plotকারণ নেই smooth |যা ব্রাস এক্সপেনশন দ্বারা উত্পাদিত শেষ স্ট্রিংয়ের অন্তর্ভুক্ত
  • আপনি smoothততক্ষণ আর্গুমেন্ট সরবরাহ করতে পারেন , যতক্ষণ আপনি ওকে বন্ধনীর আগে অবস্থিত উদ্ধৃত নির্দিষ্ট অংশের মধ্যে সঠিকভাবে অন্তর্ভুক্ত করতে পারেন; যে কোনও ক্ষেত্রে মনে রাখবেন যে আপনি কমান্ডের সমস্ত পুনরাবৃত্তি তাদের সরবরাহ করবেন

কিভাবে এটা কাজ করে

কমা-বিচ্ছিন্ন ব্রেস এক্সপেনশন আপনাকে গতিবেগে স্ট্রিং উত্পাদন করতে দেয়, প্রতিটি নির্দিষ্ট নির্দিষ্ট অংশের সাথে নির্দিষ্ট ভেরিয়েবল অংশগুলি দিয়ে তৈরি। এটি যতগুলি স্ট্রিং তৈরি করে সেখানে যেমন ভেরিয়েবল পার্টস রয়েছে, যেমন a{b,c,d}উত্পাদিত হয় ab ac ad

এখানে ছোট্ট কৌশলটি হ'ল আপনি যদি খালি পরিবর্তনশীল অংশগুলির তালিকা তৈরি করেন , যেমন ধনুর্বন্ধুর ভিতরে কেবল কমা দিয়ে থাকেন তবে ব্রেস সম্প্রসারণ কেবলমাত্র নির্দিষ্ট অংশের অনুলিপি তৈরি করে। এই ক্ষেত্রে:

smooth{,,,,}

উত্পাদন করবে:

smooth smooth smooth smooth smooth

নোট করুন যে 4 টি কমা 5 টি smoothস্ট্রিং উত্পাদন করে। এই ব্রাস এক্সপেনশনটি ঠিক কীভাবে কাজ করে: এটি অনেকগুলি কমা প্লাস এক হিসাবে স্ট্রিং তৈরি করে।

অবশ্যই আপনার ক্ষেত্রে আপনার |পৃথক প্রতিটিও প্রয়োজন smooth, তাই এটি কেবলমাত্র নির্দিষ্ট অংশে যুক্ত করুন তবে শেলটি একবারে ব্যাখ্যা না করার জন্য এটি যথাযথভাবে উদ্ধৃত করার যত্ন নিন । এটাই:

'smooth|'{,,,,}

উত্পাদন করবে:

'smooth|' 'smooth|' 'smooth|' 'smooth|' 'smooth|'

সর্বদা স্থির অংশটি অবিলম্বে খোলা বন্ধনী সংলগ্ন রাখার যত্ন নিন , অর্থাত্ ' এবং এর মধ্যে কোনও ফাঁকা স্থান নেই {

(আরও মনে রাখবেন যে স্থির অংশটি গঠনের জন্য আপনি যদি সিলেক্ট কোটসের পরিবর্তে ডাবল-কোট ব্যবহার করতে পারেন তবে যদি আপনাকে নির্দিষ্ট অংশে শেল ভেরিয়েবলগুলি প্রসারণ করতে হয় Just কিছু শেলের বিশেষ অক্ষর দেখা দিলে প্রয়োজনীয় অতিরিক্ত পালানোর বিষয়টি যত্ন নিন) একটি ডাবল-উদ্ধৃত স্ট্রিংয়ের ভিতরে)।

এই মুহুর্তে eval শেলটি একে পাইপলাইনযুক্ত কমান্ড হিসাবে ধরা হচ্ছে বলে মনে করা যেতে পারে যাতে আপনার স্ট্রিংটিতে একটি প্রয়োগ করতে হবে।

সুতরাং, এটির সংক্ষিপ্তসার হিসাবে, আপনার নমুনা মামলার পুরো কমান্ড-লাইনটি হ'ল:

generate | eval 'smooth |'{,,,,} plot

1
কলটি প্যারামিটারাইজড এমন জায়গাগুলিতে যদি এটি ব্যবহার করা হয় তবে সেখানে গুরুত্বপূর্ণ সুরক্ষা উদ্বেগ রয়েছে। পুনরাবৃত্ত বাশ ফাংশন বনাম পুনরাবৃত্ত "ইওয়াল" স্ট্রিং বিল্ডিংয়ের উপর আমার উত্তর দেখুন : কোনটি আরও ভাল সম্পাদন করে? স্ট্যাক ওভারফ্লো উপর।
চার্লস ডাফি

1
@ চার্লসডুফি evalযখন কেউ অবিশ্বস্ত, স্যানিটেশনহীন, তার মূল্যায়ন করার জন্য স্ট্রিং সরবরাহ করে তখন ব্যবহারের ক্ষেত্রে অন্তর্ভুক্ত ঝুঁকির বিষয়ে আপনার উদ্বেগের সাথে আমি সম্পূর্ণরূপে একমত, যখন এটি আপনার যুক্ত লিখিত মামলার মতো "অজানা" সামগ্রী বহন করতে পারে এমন ভেরিয়েবলগুলির সাথে ব্যবহৃত হয়। অন্যদিকে eval, কমান্ডগুলির দ্রুত "নদীর গভীরতানির্ণয়" করার জন্য খুব কার্যকরী হতে পারে, বিশেষত প্রম্পটে যখন ব্যবহৃত হয়, যেমন হাতের কেসটি মনে হয়, যেখানে evalইনপুটটি কেবল ব্যবহারকারী দ্বারা টাইপ করা একটি আক্ষরিক স্ট্রিং হবে ব্যক্তি
এলএল 3

ইতিমধ্যে অন্য কোথাও দেখা গেছে, আপনি সর্বদা eval strমর্যাদাপূর্ণ ও মূ .় মতো কিছু দিয়ে প্রতিস্থাপন করতে পারেন . /dev/stdin <<<str। এটি কেবল বোকাদের উপর প্রভাব ফেলবে তা নয়, এটি @ চার্লসডফিকে আপনার পিছনে
ফেলে রাখবে

1
@ পিজেডলেক্ট, আপনি এলএল 3 এর পূর্ববর্তী মন্তব্যটি মনোযোগ সহকারে পড়তে পারেন - এটি ভারসাম্যহীন, সংক্ষিপ্ত এবং বুদ্ধিমান। (প্রকৃতপক্ষে, আমার নিজের প্রাথমিক মন্তব্যে আপনি উপেক্ষা করছেন বলে মনে হয়েছে; "যদি কলটি প্যারামিটারাইজড হয় এমন ক্ষেত্রে ব্যবহার করা হয়" তবে এটি একটি গুরুত্বপূর্ণ পার্থক্য: এলএল 3 এর উদাহরণটি প্যারামিটারাইজড নয় , এটি নিরাপদ করে তোলে))।
চার্লস ডাফি
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.