আজকের আগ পর্যন্ত আমি কোনও পুরস্কারের বিষয়ে অবগত ছিলাম না যখন কোনও ছদ্মবেশী আমার উত্তরগুলির জন্য আমার উপর ইউইউসি পিন করার চেষ্টা করেছিল। এটি ছিল একটি cat file.txt | grep foo | cut ... | cut ...। আমি তাকে আমার মনের এক টুকরো দিয়েছি এবং তা করার পরেই তিনি আমাকে দেওয়া লিঙ্কটি পরিদর্শন করেছেন এবং পুরষ্কারের উত্স এবং এটি করার অনুশীলনের কথা উল্লেখ করেছেন। আরও অনুসন্ধান আমাকে এই প্রশ্নের দিকে নিয়ে গেল। কিছুটা দুর্ভাগ্যক্রমে সচেতন বিবেচনা করেও উত্তরের কোনও উত্তরই আমার যুক্তি অন্তর্ভুক্ত করে না।
আমি তাকে শিক্ষিত করার সময় আত্মরক্ষামূলক হতে চাইনি। সর্বোপরি, আমার কনিষ্ঠ বছরগুলিতে আমি কমান্ডটি লিখতাম grep foo file.txt | cut ... | cut ...কারণ আপনি যখনই ঘন ঘন এককটি করেন grepআপনি ফাইল আর্গুমেন্টের স্থানটি শিখেন এবং এটি প্রস্তুত জ্ঞান যে প্রথমটি প্যাটার্ন এবং পরবর্তীগুলি ফাইলের নাম।
এটি একটি সচেতন পছন্দ ছিল যখন আমি catআংশিকভাবে "ভাল স্বাদ" (লিনাস টরভাল্ডসের ভাষায়) কারণের কারণে কারণটির প্রধানত কার্যটির বাধ্যতামূলক কারণগুলির জন্য প্রশ্নের উত্তর দিয়েছিলাম।
পরবর্তী কারণটি আরও গুরুত্বপূর্ণ কারণ আমি এটি প্রথমে প্রকাশ করব। আমি যখন সমাধান হিসাবে পাইপলাইন সরবরাহ করি তখন আমি এটি পুনরায় ব্যবহারযোগ্য হবে বলে আশা করি। এটি সম্ভবত সম্ভবত একটি পাইপলাইন যুক্ত হবে বা অন্য পাইপলাইনে ছড়িয়ে দেওয়া হবে। সেক্ষেত্রে গ্রেপ স্ক্রুগুলিতে পুনরায় ব্যবহারযোগ্যতার জন্য একটি ফাইল আর্গুমেন্ট থাকা এবং ফাইল আর্গুমেন্ট উপস্থিত থাকলে সম্ভবত ত্রুটি বার্তা ছাড়াই নিঃশব্দে এটি করুন do আই। ই। grep foo xyz | grep bar xyz | wcআপনি দিতে কত লাইনে হবে xyzধারণ barযখন আপনি লাইন উভয় ধারণ সংখ্যা আশা করছি fooএবং bar। পাইপলাইনে কোনও কমান্ডের সাথে যুক্তিগুলি পরিবর্তন করার আগে এটি ব্যবহার করার পরে ত্রুটি হওয়ার আশঙ্কা রয়েছে। এতে নীরব ব্যর্থতার সম্ভাবনা যুক্ত হয় এবং এটি একটি বিশেষভাবে কুখ্যাত অভ্যাসে পরিণত হয়।
পূর্বের কারণটি গুরুত্বহীন নয় কারণ প্রচুর "ভাল স্বাদ" নিছক উপরের নীরব ব্যর্থতার মতো বিষয়গুলির জন্য একটি স্বজ্ঞাত অবচেতন যুক্তি যা আপনি এই মুহুর্তে সঠিকভাবে ভাবতে পারবেন না যখন শিক্ষার প্রয়োজনে কোনও ব্যক্তি বলেন "তবে তা নয় "বিড়াল অকেজো"।
যাইহোক, আমি উল্লেখ করেছি প্রাক্তন "ভাল স্বাদ" কারণ সচেতন করার চেষ্টা করব। সেই কারণটির সাথে ইউনিক্সের অরথোগোনাল ডিজাইন স্পিরিটের সাথে সম্পর্ক রয়েছে। grepনা cutএবং lsনা grep। অতএব খুব কমপক্ষে grep foo file1 file2 file3ডিজাইন স্পিরিটের বিরুদ্ধে যায়। এটি করার অर्थোগোনাল উপায় cat file1 file2 file3 | grep foo। এখন, grep foo file1এটি কেবল একটি বিশেষ কেস grep foo file1 file2 file3এবং আপনি যদি একইরকম আচরণ না করেন তবে আপনি অন্তত অব্যর্থ বিড়াল পুরস্কার এড়ানোর চেষ্টা করছেন মস্তিষ্কের ঘড়িচক্র ব্যবহার করছেন।
এটি আমাদেরকে তর্ক করে তোলে যে যুক্তিযুক্ত grep foo file1 file2 file3, এবং যুক্তিযুক্ত catতাই এটি যথাযথ cat file1 file2 file3তবে কারণ এ catবিষয়ে কনটেন্টেটিং নয় cat file1 | grep fooতাই আমরা উভয় catএবং সর্বশক্তিমান ইউনিক্সের চেতনাকে লঙ্ঘন করছি । ঠিক আছে, যদি এমনটি হয় তবে ইউনিক্সের একটি ফাইলের আউটপুট পড়ার জন্য আলাদা কমান্ডের দরকার হত এবং এটি স্টাডআউটে থুথু দেওয়া হত (এটি প্যাগিনেটে বা স্টাডআউটে কেবল একটি খাঁটি থুতু না)। সুতরাং আপনি যে পরিস্থিতিটি বলবেন cat file1 file2বা আপনি বলছেন dog file1এবং আন্তরিকতার cat file1সাথে পুরষ্কারটি এড়াতে এড়াতে ভুলে যাবেন সেই পরিস্থিতিতে আপনার পরিস্থিতি থাকবে এবং পাশাপাশি এড়ানোও আশাবাদী dog file1 file2কারণ dogএকাধিক ফাইল নির্দিষ্ট করা থাকলে ডিজাইনের ত্রুটি ঘটবে।
আশা করি এই মুহুর্তে আপনি ইউনিক্স ডিজাইনারদের প্রতি সহানুভূতি প্রকাশ করেছেন কোনও স্টডআউটে কোনও ফাইল স্পিট করার জন্য একটি পৃথক কমান্ড না দেওয়ার পাশাপাশি cat, এটি অন্য কোনও নাম দেওয়ার পরিবর্তে কনজেনেটের নামকরণও করবেন। <edit>এমন কুকুর আছে, দুর্ভাগ্যজনক <অপারেটর। এটি দুর্ভাগ্যজনক যে পাইপলাইনটির শেষে এটি সহজে বসানো রোধ করে place শুরুতে এটি স্থাপনের কোনও সিনথেটিক বা নান্দনিক দিক থেকে পরিষ্কার উপায় নেই। এটি পর্যাপ্ত সাধারণ না হওয়াও দুর্ভাগ্যজনক, তাই আপনি কুকুরটির সাথে শুরু করেন তবে কেবল অন্য ফাইলনাম যুক্ত করুন যদি আপনি চান যে এটি পূর্বেরটির পরেও প্রক্রিয়া করা হয়। ( >অন্যদিকে অর্ধেকটি খারাপ নয় It শেষ দিকে এটি প্রায় নিখুঁত স্থান রয়েছে It এটি সাধারণত পাইপলাইনের পুনরায় ব্যবহারযোগ্য অংশ নয়, এবং সেই অনুসারে এটি প্রতীকীভাবে পৃথক করা হয়))</edit>
পরবর্তী প্রশ্নটি হ'ল কেন কোনও প্রক্রিয়া ছাড়াই কমান্ডগুলি কেবল একটি ফাইল বা একাধিক ফাইলের স্ট্যান্ডআউটেটেডকে স্পিট করে দেওয়া গুরুত্বপূর্ণ? একটি কারণ হ'ল কমপক্ষে একটি কমান্ড লাইন ফাইল আর্গুমেন্টকে কীভাবে পার্স করতে হয় এবং এটি উপস্থিত থাকলে ইনপুট হিসাবে ব্যবহার করতে স্ট্যান্ডার্ড ইনপুটটিতে পরিচালিত প্রতিটি একক ইউনিক্স কমান্ড থাকা এড়ানো। দ্বিতীয় কারণ হ'ল ব্যবহারকারীদের মনে রাখতে হবে: (ক) ফাইলের নাম আর্গুমেন্টগুলি যেখানে যায়; এবং (খ) উপরে বর্ণিত নীরব পাইপলাইন বাগটি এড়ানো উচিত avoid
এটি আমাদের কাছে নিয়ে আসে কেন grepঅতিরিক্ত যুক্তি রয়েছে। যুক্তিটি হ'ল আদেশগুলি যেগুলি প্রায়শই এবং স্ট্যান্ড-একা ভিত্তিতে ব্যবহৃত হয় (পাইপলাইন হিসাবে নয়) এর জন্য ব্যবহারকারী-সাবলীলতার অনুমতি দেয় । ব্যবহারের ক্ষেত্রে তাৎপর্য অর্জনের জন্য এটি অরথোগোনালটির সামান্য সমঝোতা। সমস্ত কমান্ড এইভাবে ডিজাইন করা উচিত নয় এবং যে আদেশগুলি প্রায়শই ব্যবহার করা হয় না তাদের ফাইল আর্গুমেন্টগুলির অতিরিক্ত যুক্তি সম্পূর্ণরূপে এড়ানো উচিত নয় (অতিরিক্ত যুক্তি মনে রাখবেন অপ্রয়োজনীয় ভঙ্গুরতা বাড়ে (বাগের সম্ভাবনা))। ব্যতিক্রম ক্ষেত্রে ফাইল মতামত অনুমোদন করা grep। (যেভাবে নোটের lsসম্পূর্ণ ভিন্ন কারণ রয়েছে কেবল গ্রহণযোগ্য নয় তবে ফাইল আর্গুমেন্টের প্রয়োজন অনেক বেশি)
পরিশেষে, যদি স্ট্যান্ডার্ড ইনপুট উপলব্ধ থাকে তবে এই ধরনের ব্যতিক্রমী কমান্ডগুলি grep(তবে অগত্যা নয় ls) যদি ত্রুটি তৈরি করে তবে আরও ভাল কী করা যেত । এটি যুক্তিযুক্ত কারণ আদেশগুলিতে যুক্তি অন্তর্ভুক্ত রয়েছে যা ব্যবহারকারীর সুবিধার্থে সর্বশক্তিমান ইউনিক্সের অর্থোথোনাল স্পিরিট লঙ্ঘন করে। আরও ব্যবহারকারীর সুবিধার্থে, অর্থাত্ নীরব ব্যর্থতার কারণে যন্ত্রণা রোধ করার জন্য, যদি নীরব ব্যর্থতার কোনও সম্ভাবনা থাকে তবে ব্যবহারকারীকে সতর্ক করে তাদের নিজস্ব লঙ্ঘন লঙ্ঘন করতে দ্বিধা করা উচিত নয়।