ইউনিক্স শেল "স্টিডিন / স্টডআউট এপিআই" কতটা স্থিতিশীল?


20

গ্রেপিং, অ্যাগ্রিং, সিডিং এবং পাইপিং কোনও ইউনিক্স-মতো অপারেটিং সিস্টেমের ব্যবহারকারীর প্রতিদিনের রুটিন, এটি কমান্ড লাইনে বা শেল স্ক্রিপ্টের অভ্যন্তরে থাকতে পারে (সম্মিলিতভাবে ফিল্টারগুলি এখন থেকে বলা হয়)।

তাদের মূলত, "স্ট্যান্ডার্ড" ইউনিক্স সিএলআই প্রোগ্রাম এবং শেল বিল্টিনস ( এখন থেকে সম্মিলিতভাবে কমান্ড বলা হয়) এর সাথে কাজ করার সময়, সঠিকভাবে কাজ করার জন্য ফিল্টারগুলির প্রতিটি ফিল্টার ধাপে স্টিডিন, স্টাডআউট এবং স্টডারারের জন্য একটি সুনির্দিষ্ট প্রত্যাশিত বিন্যাস প্রয়োজন। আমি কিছু কমান্ডের এই সুনির্দিষ্ট প্রত্যাশিত ফর্ম্যাটটিকে নীচে এই কমান্ডের একটি এপিআই বলি।

ওয়েব ডেভলপমেন্ট ব্যাকগ্রাউন্ডের একজন হিসাবে আমি এই জাতীয় ডেটা সংগ্রহ এবং ডেটা প্রসেসিং প্রযুক্তিগতভাবে ওয়েব স্ক্র্যাপিংয়ের সাথে তুলনা করি - এমন একটি প্রযুক্তি যা যখনই ডেটা উপস্থাপনায় সামান্যতম পরিবর্তন হয় তখন খুব অস্থির হয়।

আমার প্রশ্নটি এখন ইউনিক্স কমান্ড এপিআইয়ের স্থায়িত্বের সাথে সম্পর্কিত।

  1. ইউনিক্স-এর মতো অপারেটিং সিস্টেমে কমান্ডগুলি কি তাদের ইনপুট এবং আউটপুট সম্পর্কে সম্মতিযুক্ত একটি আনুষ্ঠানিক মানকে মান্য করে?
  2. ইতিহাসে এমন কিছু উদাহরণ রয়েছে যেখানে কিছু গুরুত্বপূর্ণ কমান্ডের আপডেটগুলি সেই কমান্ডের পুরানো সংস্করণ ব্যবহার করে তৈরি হওয়া কিছু ফিল্টারের কার্যকারিতা ভঙ্গ করেছিল?
  3. সময়ের সাথে সাথে ইউনিক্স কমান্ডগুলি পরিপক্ক হয়েছে যে কোনও ফিল্টারটি ভেঙে যেতে পারে এমনভাবে পরিবর্তন করা একেবারেই অসম্ভব?
  4. কমান্ড API গুলি পরিবর্তনের কারণে ফিল্টারগুলি সময়ে সময়ে ভেঙে যেতে পারে তবে আমি কীভাবে বিকাশকারী হিসাবে এই সমস্যাগুলির বিরুদ্ধে আমার ফিল্টারগুলি রক্ষা করতে পারি?

উত্তর:


17

POSIX 2008 স্ট্যান্ডার্ডের "শেল এবং ইউটিলিটিস" বর্ণনা করার একটি বিভাগ রয়েছে । সাধারণত, যদি আপনি এই লেগে থাকেন যে আপনার স্ক্রিপ্টগুলি যথাযথভাবে হ্রাস ছাড়া কেবল ভবিষ্যতের প্রমাণ হওয়া উচিত তবে এগুলি রাতারাতি খুব কম হয় তাই আপনার স্ক্রিপ্টগুলি আপডেট করার জন্য আপনার প্রচুর সময় থাকা উচিত।

কিছু কিছু ক্ষেত্রে যেখানে একটি একক উপযোগ জন্য আউটপুট ফরম্যাট প্ল্যাটফর্ম এবং সংস্করণ জুড়ে ব্যাপক তারতম্য সালে POSIX মান সাধারণত নামক একটি বিকল্প অন্তর্ভুক্ত হতে পারে -pবা -Pযা নির্দিষ্ট করে একটি গ্যারান্টিযুক্ত এবং আন্দাজের আউটপুট বিন্যাস। এর উদাহরণ timeইউটিলিটি , যা বিভিন্নভাবে বাস্তবায়ন করে। আপনার যদি স্থিতিশীল এপিআই / আউটপুট ফর্ম্যাট প্রয়োজন হয় তবে আপনি ব্যবহার করতে পারেন time -p

যদি আপনাকে এমন ফিল্টার ইউটিলিটি ব্যবহার করতে হয় যা পসিক্স স্ট্যান্ডার্ড দ্বারা আচ্ছাদিত না হয় তবে ওয়েব স্ক্র্যাপিং করার সময় আপনি যেমন রিমোট ওয়েব ডেভেলপারদের করুণায় রয়েছেন ঠিক তেমনই আপনি বিতরণ প্যাকেজারগুলি / আপস্ট্রিম বিকাশকারীদের করুণায় রয়েছেন।


12

আমি আমার অভিজ্ঞতা থেকে উত্তর দেওয়ার চেষ্টা করব।

  1. কমান্ডগুলি আসলে একটি আনুষ্ঠানিক স্পেসিফিকেশন মেনে চলেন না, তবে লাইন-ভিত্তিক পাঠ্য গ্রহণ ও উত্পন্ন করার জন্য তারা প্রয়োজনীয়তার সাথে মেনে চলেন।

  2. হ্যা অবশ্যই. আগে গনুহ ইউটিলিটি একটি স্বতন্ত্র মান হয়ে ওঠে, বিক্রেতাদের অনেকটা বিশেষত সম্মান সঙ্গে করা বিচিত্র আউটপুট পাওয়া যায়, হবে psএবং ls। এতে প্রচুর ব্যথা হয়েছিল। আজ, কেবল এইচপি সুপার-কিরকী আদেশগুলি সরবরাহ করে। Icallyতিহাসিকভাবে, বার্কলে সফটওয়্যার ডিস্ট্রিবিউশন (বিএসডি) ইউটিলিটিগুলি অতীতের সাথে একটি বড় বিরতি ছিল। পসিক্সের স্পেসিফিকেশনটি অতীতের সাথে বিরতি ছিল, তবে এখন এটি ব্যাপকভাবে স্বীকৃত।

  3. ইউনিক্স কমান্ডগুলি সত্যই সময়ের সাথে সাথে পরিপক্ক হয়েছে। পুরানো সংস্করণের জন্য লেখা কিছু স্ক্রিপ্ট ভাঙ্গা এখনও অসম্ভব। টেক্সট ফাইল এনকোডিং হিসাবে ইউটিএফ -8 এর দিকে সাম্প্রতিক প্রবণতা সম্পর্কে চিন্তা করুন। এই পরিবর্তনটির মতো বেসিক ইউটিলিটিগুলি পরিবর্তন করা দরকার tr। অতীতে, সহজ পাঠ্য প্রায় সর্বদা ASCII (বা কাছাকাছি কিছু) ছিল, তাই ছোট হাতের অক্ষরগুলির মতো বড় হাতের অক্ষরগুলি একটি সাংখ্যিক পরিসীমা তৈরি করে। এটি ইউটিএফ -8 এর সাথে আর সত্য নয়, সুতরাং tr"বড় হাতের অক্ষর" বা "আলফানিউমারিক" এর মতো জিনিস নির্দিষ্ট করতে বিভিন্ন কমান্ড লাইন বিকল্প গ্রহণ করতে পারে।

  4. আপনার ফিল্টারগুলিকে "শ্রমসাধ্য" করার সর্বোত্তম উপায়গুলির মধ্যে একটি হল নির্দিষ্ট পাঠ্য বিন্যাসের উপর নির্ভর না করা। উদাহরণস্বরূপ, করবেন না cut -c10-24, যা কোনও লাইনের অবস্থানের উপর নির্ভর করে। cut -f2পরিবর্তে ব্যবহার করুন, যা ২ য়, ট্যাব-বিভাজিত ক্ষেত্রটি কেটে ফেলবে। awkযে কোনও ইনপুট লাইনটি $ 1, $ 2, $ 3 ... এ বিভক্ত করে যা সাদা-স্পেস ডিফল্টরূপে পৃথক হয়। কলাম অবস্থানের মতো নিম্ন-স্তরের ধারণাগুলির চেয়ে "ক্ষেত্রগুলি" এর মতো উচ্চ-স্তরের ধারণার উপর নির্ভরশীল। এছাড়াও, নিয়মিত এক্সপ্রেশন ব্যবহার করুন: sedএবং awkউভয়ই নিয়মিত ভাবের সাহায্যে এমন কিছু করতে পারেন যা ইনপুটটির কিছু বৈকল্পিকতা সম্পর্কে চিন্তা করে না। আরেকটি কৌশলটি হ'ল এমন কিছুতে ইনপুট প্রক্রিয়া করা যার ফর্ম্যাটটি আপনার ফিল্টারটি পিক হতে পারে। tr -cs '[a-zA-z0-9]' '[\n]'বিরামচিহ্ন ছাড়াই প্রতি লাইনে একক শব্দের পাঠ্য ভাঙ্গতে ব্যবহার করুন । আপনি শুধু ডন '


9

প্রথম, আপনার প্রশ্নের খুব সংক্ষিপ্ত উত্তর:

  1. ইনপুট / আউটপুট কনভেনশনগুলির আনুষ্ঠানিক মানকরণ: না
  2. আউটপুট পরিবর্তনের কারণে অতীতে বিরতি: হ্যাঁ
  3. ভবিষ্যতের ফিল্টারগুলি ভাঙতে একেবারে অসম্ভব: না
  4. আমি কীভাবে পরিবর্তনের বিরুদ্ধে নিজেকে রক্ষা করতে পারি: রক্ষণশীল হন

আপনি যখন "এপিআই" বলছেন, আপনি এমন একটি শব্দ ব্যবহার করছেন যা (ভাল বা অসুস্থের জন্য) ফিল্টার ইনপুট / আউটপুট কনভেনশনগুলির চারপাশে খুব বেশি আনুষ্ঠানিকতা বোঝায়। খুব (এবং আমি অর্থ "খুব" বলতে চাই) মূলত, সহজেই ফিল্টারিংয়ের জন্য উপাত্ত প্রাপ্ত ডেটাগুলির জন্য প্রাথমিক সম্মেলনগুলি

  • প্রতিটি ইনপুট লাইন একটি সম্পূর্ণ রেকর্ড
  • প্রতিটি রেকর্ডের মধ্যে, ক্ষেত্রগুলি একটি পরিচিত সীমানার অক্ষর দ্বারা পৃথক করা হয়

একটি সর্বোত্তম উদাহরণ হ'ল / ইত্যাদি / পাসডাব্লুডের ফর্ম্যাট। তবে, এই ডিফল্ট কনভেনশনগুলি সম্ভবত চিঠির অনুসরণের চেয়ে বেশি কিছু বেশি সময় লঙ্ঘিত হয়।

  • প্রচুর ফিল্টার রয়েছে (প্রায়শই অর্ক বা পার্লে লেখা থাকে) যা মাল্টলাইন ইনপুট ফর্ম্যাটগুলি পার্স করে।
  • প্রচুর ইনপুট প্যাটার্ন রয়েছে (যেমন, / var / লগ / বার্তা) যেখানে কোনও ভাল সংজ্ঞায়িত ক্ষেত্র কাঠামো নেই এবং আরও সাধারণ নিয়মিত এক্সপ্রেশন-ভিত্তিক কৌশল ব্যবহার করা আবশ্যক।

আপনার চতুর্থ প্রশ্ন, আউটপুট কাঠামোর পরিবর্তনের থেকে নিজেকে কীভাবে রক্ষা করবেন, এটিই কেবলমাত্র আপনি যে বিষয়ে কিছু করতে পারেন is

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

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


5

আপনার প্রশ্নের 1) কেবল আবরণ।

স্বাভাবিকভাবেই API গুলি সর্বদা তাদের স্রষ্টাদের ইচ্ছায় পরিবর্তন করতে পারে এবং ফলস্বরূপ যে কোনও ভাষায় নির্ভরশীল সফ্টওয়্যারটি ভেঙে দেয়। এটি বলেছিল, ইউনিক্স সরঞ্জামগুলির আইআই / ও "এপিআই" এর দুর্দান্ত ধারণাটি হ'ল কার্যত কোনওটি নেই (সম্ভবত 0x0aলাইন শেষ হিসাবে)। একটি ভাল স্ক্রিপ্ট ডেটা তৈরির পরিবর্তে ইউনিক্স সরঞ্জাম দিয়ে ফিল্টার করে। এর অর্থ হ'ল আপনার স্ক্রিপ্টটি ভেঙে যেতে পারে কারণ ইনপুট বা আউটপুট স্পেক পরিবর্তিত হয়েছে, তবে স্ক্রিপ্টটিতে ব্যবহৃত পৃথক সরঞ্জামগুলির I / O ফর্ম্যাটটি (আবার সত্যিই একটি নেই) কারণ পরিবর্তিত হয়েছে (কারণ এমন কিছু যা সত্যই বিদ্যমান নেই) সত্যিই পরিবর্তন করতে পারে না)।

বুনিয়াদি সরঞ্জামগুলির তালিকাগুলিতে গিয়ে কেবলমাত্র ফিল্টারের বিপরীতে আমি প্রযোজককেও দায়ী করব এমন কয়েকটি রয়েছে :

  • ডাব্লুসিসি - বাইট, শব্দ, লাইনগুলির মুদ্রণ সংখ্যা - খুব সাধারণ বিন্যাস, সম্ভবত পরিবর্তনের সম্ভাবনা একেবারেই কম, এবং তদুপরি স্ক্রিপ্টে সম্ভবত ব্যবহারের সম্ভাবনা খুব বেশি নয়।
  • ডিফ - সেখানে বিভিন্ন আউটপুট ফর্ম্যাটগুলি বিকশিত হয়েছে তবে আমি কোনও সমস্যা শুনিনি। তদারকি ছাড়া সাধারণত ব্যবহৃত হয় না।
  • তারিখ - এখন এখানে সত্যই আমরা সিস্টেমের লোকাল সম্পর্কিত আমরা কী উত্পাদন করি সেদিকে খেয়াল রাখতে হবে। তবে অন্যথায় আউটপুট ফর্ম্যাটটি আরএফসি'র হয়ে থাকে আপনি নিজেরাই এটি নির্দিষ্ট করে নিচ্ছেন না।
  • ক্যাল - আসুন এটি সম্পর্কে কথা বলি না, আমি জানি যে আউটপুট ফর্ম্যাটটি সিস্টেমগুলিতে খুব আলাদা।
  • ls , কে , ডাব্লু , শেষ - আপনি যদি এলএস পার্স করতে চান তবে আমি সহায়তা করতে পারি না, এটি কেবল বোঝানো হয়নি। এছাড়াও, কে, ডাব্লু, শেষ, আরও ইন্টারঅ্যাকটিভ লাস্টার; আপনি যদি এগুলি কোনও স্ক্রিপ্টে ব্যবহার করেন তবে আপনার কি করা উচিত সেদিকে খেয়াল রাখতে হবে।
  • সময় অন্য পোস্টে চিহ্নিত করা হয়েছিল। তবে হ্যাঁ, এটি Ls এর মতোই। ইন্টারেক্টিভ / স্থানীয় ব্যবহারের জন্য আরও। এবং ব্যাশ বিল্টিনটি জিএনইউ সংস্করণ থেকে একেবারেই আলাদা এবং জিএনইউ সংস্করণে বহু বছর ধরে ফিক্সযুক্ত বাগ রয়েছে। শুধু এটির উপর নির্ভর করবেন না।

এখানে এমন সরঞ্জামগুলি রয়েছে যা একটি নির্দিষ্ট ইনপুট ফর্ম্যাটটি বাইট স্ট্রিম হওয়ার চেয়ে আরও সুনির্দিষ্টভাবে প্রত্যাশা করে:

  • বিসি , ডিসি - ক্যালকুলেটর। ইতিমধ্যে জিনিসগুলির আরও হ্যাকিশ দিকে (সত্যিই, আমি এগুলি স্ক্রিপ্টগুলিতে ব্যবহার করি না), এবং সম্ভবত খুব স্থিতিশীল I / O ফর্ম্যাটগুলি।

ভাঙ্গার অনেক বেশি ঝুঁকির সাথে আরও একটি ক্ষেত্র রয়েছে, যথা কমান্ড-লাইন ইন্টারফেস। বেশিরভাগ সরঞ্জামগুলির সিস্টেম এবং সময়রেখার উভয়ই আলাদা বৈশিষ্ট্য রয়েছে। উদাহরণগুলি হ'ল

  • রেজেক্স - রেজেক্স ব্যবহার করে সমস্ত সরঞ্জাম সিস্টেম লোকেলের উপর ভিত্তি করে অর্থ পরিবর্তন করতে পারে (উদাহরণস্বরূপ, LC_COLLATE) এবং রেজেক্স বাস্তবায়ন জুড়ে অনেকগুলি সূক্ষ্মতা এবং অদ্ভুততা রয়েছে।
  • কেবল অভিনব সুইচগুলি ব্যবহার করবেন না। আপনি সহজেই man 1p findউদাহরণস্বরূপ ব্যবহার করতে পারেন , সিস্টেম ম্যানপেজের পরিবর্তে পসিক্স সন্ধানের ম্যানপেজটি পড়তে। আমার সিস্টেমে, আমার ম্যানাপেজ-পক্সিক্স ইনস্টল করা দরকার।

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

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

অধিকন্তু, বিরল জায়গাগুলিতে যেখানে বিরতি অসম্পূর্ণতার কারণে ঘটতে পারে, এটি সম্ভবত সময় প্রেরণার কারণে নয়, তবে বিভিন্ন সিস্টেমে বৈচিত্র্যের কারণে ঘটে (অর্থাত যদি এটি আপনার পক্ষে কাজ করে তবে এটি 20 বছর আগে করেছিল এবং 20 বছরে হবে) খুব)। এটি সরঞ্জামগুলির সরলতার একটি প্রতীক।


1

কেবলমাত্র ডিও ফ্যাক্টো আইও মান রয়েছে - সাদা স্থান এবং নাল পৃথক আউটপুট।

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


0

স্ক্রিপ্টগুলি কিছুটা প্রায়শই অন্যদের চেয়ে ভেঙে যায়। পুরানো এবং বিখ্যাত সফ্টওয়্যার তুলনামূলকভাবে একই থাকার প্রবণতা রাখে এবং যেভাবে যাইহোক পরিবর্তিত হলে প্রায়শই সামঞ্জস্যের পতাকা থাকে।

একটি সিস্টেমে লিখিত স্ক্রিপ্টগুলিতে কাজ চালিয়ে যাওয়ার প্রবণতা থাকে তবে প্রায়শই অন্যটি ভেঙে যায়।

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