বিড়ালের অকেজো ব্যবহার?


103

এটি সম্ভবত অনেকগুলি প্রায়শই জিজ্ঞাসিত প্রশ্নাবলীতে - ব্যবহারের পরিবর্তে:

cat file | command

(যাকে বিড়ালের অকেজো ব্যবহার বলা হয়), সঠিক উপায় বলে মনে করা হচ্ছে:

command < file

২ য়, "সঠিক" উপায়ে - ওএসকে কোনও অতিরিক্ত প্রক্রিয়া করতে হবে না।
এটি জানার পরেও আমি অকার্যকর বিড়ালটিকে 2 কারণে ব্যবহার করতে থাকি।

  1. আরও নান্দনিক - আমি পছন্দ করি যখন ডেটা কেবল বাম থেকে ডানে একত্রে সরানো হয়। এবং catঅন্য কোনও কিছু ( gzcat,, echo...) দিয়ে প্রতিস্থাপন করা সহজ , ২ য় ফাইল যুক্ত করুন বা নতুন ফিল্টার pv, োকানো ( mbuffer,, grep...)।

  2. আমি "অনুভব করেছি" যে এটি কিছু ক্ষেত্রে দ্রুত হতে পারে। দ্রুততর কারণ এখানে 2 টি প্রক্রিয়া রয়েছে, প্রথম ( cat) পঠন করে এবং দ্বিতীয়টি যা কিছু করে তা করে। এবং তারা সমান্তরালভাবে চালাতে পারে, যার অর্থ কখনও কখনও দ্রুত সম্পাদন করা হয়।

আমার যুক্তি কি সঠিক (২ য় কারণে)?


23
catএকটি পরিচয় পাইপ । এটি কেবলমাত্র তার ইনপুটটিকে তার আউটপুটে প্রবাহিত করে। শৃঙ্খলে থাকা দ্বিতীয় প্রোগ্রামটি যদি আপনার একই আর্গুমেন্টে পাস করে cat(বা স্ট্যান্ডার্ড ইনপুট থেকে, যদি আপনি কোনও যুক্তি পাস করেন না) থেকে নিতে পারেন, তবে catএটি একেবারেই অকেজো এবং কেবলমাত্র একটি অতিরিক্ত প্রক্রিয়া কাঁটাযুক্ত হওয়ার ফলে এবং একটি অতিরিক্ত পাইপ হওয়ার ফলস্বরূপ তৈরি
ফ্রিডরিক হামিদি

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

4
Partmaps.org- র পূর্বের জনপ্রিয় লিঙ্কটি দুর্ভাগ্যক্রমে মারা গেছে। বিষয়বস্তু এখন porkmail.org/era/unix/award.html
ট্রিপল


4
আমি পর্যবেক্ষণ করেছি যে আপনি যদি ডানদিকের ডেটাফ্লো প্রদর্শন করতে চান (কারণ 1) আপনি ফাইলটি পুনর্নির্দেশটি কমান্ডের আগে রেখেই করতে পারেন <file command1 | command2, যদিও নান্দনিকতা সম্পর্কে মতভেদ রয়েছে।
হোল্ডেনওয়েব

উত্তর:


83

আজকের আগ পর্যন্ত আমি কোনও পুরস্কারের বিষয়ে অবগত ছিলাম না যখন কোনও ছদ্মবেশী আমার একটি উত্তরের জন্য আমাকে ইউইওসি পিন করার চেষ্টা করেছিল । এটি ছিল একটি 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একাধিক ফাইল সুনির্দিষ্ট করা থাকলে ডিজাইনের ত্রুটি ঘটবে of

আশা করি, এই মুহুর্তে আপনি ইউনিক্স ডিজাইনারদের প্রতি সহানুভূতি প্রকাশ করেছেন কোনও স্টডআউটে কোনও ফাইল স্পিট করার জন্য একটি পৃথক কমান্ড না দেওয়ার পাশাপাশি cat, এটি অন্য কোনও নাম দেওয়ার পরিবর্তে কনজেনেটের নামকরণও করবেন। সত্যিকার অর্থে <edit>ভুল মন্তব্যগুলি মুছে ফেলা একটি স্ট্যান্ডআউটে একটি ফাইল স্পিট করার জন্য একটি দক্ষ নকল অনুলিপি সুবিধা যা আপনি পাইপলাইনের শুরুতে অবস্থান করতে পারেন তাই ইউনিক্স ডিজাইনাররা এর জন্য বিশেষভাবে কিছু অন্তর্ভুক্ত করেছিলেন<<</edit>

পরবর্তী প্রশ্নটি হ'ল কেন কোনও প্রক্রিয়া ছাড়াই কেবল কোনও ফাইল বা একাধিক ফাইলের স্ট্যান্ডআউটেটেড করার জন্য যে আদেশগুলি থাকা উচিত? একটি কারণ হ'ল কমপক্ষে একটি কমান্ড লাইন ফাইল যুক্তি কীভাবে পার্স করতে হয় তা জানার জন্য স্ট্যান্ডার্ড ইনপুটটিতে পরিচালিত প্রতিটি একক ইউনিক্স কমান্ড থাকা এবং এটি উপস্থিত থাকলে ইনপুট হিসাবে ব্যবহার করা। দ্বিতীয় কারণ হ'ল ব্যবহারকারীদের মনে রাখতে হবে: (ক) ফাইলের নাম আর্গুমেন্টগুলি যেখানে যায়; এবং (খ) উপরে বর্ণিত নীরব পাইপলাইন বাগটি এড়ানো উচিত avoid

এটি আমাদের কাছে নিয়ে আসে কেন grepঅতিরিক্ত যুক্তি রয়েছে। যুক্তিটি হ'ল আদেশগুলি যেগুলি প্রায়শই এবং এককভাবে ভিত্তিতে ব্যবহৃত হয় (পাইপলাইন হিসাবে নয়) ব্যবহারের জন্য ব্যবহারকারী-সাবলীলতার অনুমতি দেয় । ব্যবহারের ক্ষেত্রে তাৎপর্য অর্জনের জন্য এটি অরথোগোনালটির সামান্য সমঝোতা। সমস্ত কমান্ড এইভাবে ডিজাইন করা উচিত নয় এবং যে আদেশগুলি প্রায়শই ব্যবহার করা হয় না তাদের ফাইল আর্গুমেন্টগুলির অতিরিক্ত যুক্তি সম্পূর্ণরূপে এড়ানো উচিত নয় (অতিরিক্ত যুক্তি মনে রাখবেন অপ্রয়োজনীয় ভঙ্গুরতা বাড়ে (বাগের সম্ভাবনা))। ব্যতিক্রম ক্ষেত্রে ফাইল মতামত অনুমোদন করা grep। (যাইহোক, নোট করুন যা lsকেবল গ্রহণ না করার জন্য সম্পূর্ণ ভিন্ন কারণ রয়েছে তবে ফাইল আর্গুমেন্টের প্রয়োজন অনেক বেশি)

পরিশেষে, ফাইল আর্গুমেন্ট নির্দিষ্ট করা থাকলে স্ট্যান্ডার্ড ইনপুট উপস্থিত থাকলে যদি এরূপ ব্যতিক্রমী কমান্ডগুলি ত্রুটি উত্পন্ন করে grepতবে এর চেয়ে ভাল কী করা যেতে পারে ls


53
দ্রষ্টব্য যে যখন grepএকাধিক ফাইলের নামের সাথে আহ্বান করা হয় , তখন এটি যে ফাইলটি পাওয়া গিয়েছিল তার নামের সাথে পাওয়া লাইনগুলিকে উপস্থাপিত করে (যদি আপনি সেই আচরণটি বন্ধ না করেন)। এটি পৃথক ফাইলে লাইন নম্বরগুলিও প্রতিবেদন করতে পারে। যদি কেবল catখাওয়ার জন্য ব্যবহার করা হয় তবে grepআপনি ফাইলের নামটি হারাবেন এবং লাইন নম্বরগুলি প্রতিটি ফাইলের চেয়ে অবিচ্ছিন্ন থাকে, প্রতি ফাইল হিসাবে নয়। সুতরাং grepহ্যান্ডেল catকরতে পারে না এমন একাধিক ফাইল হ্যান্ডেল করার কারণ রয়েছে reasons একক ফাইল এবং শূন্য ফাইল ক্ষেত্রে কেবল সাধারণ বহু-ফাইল ব্যবহারের বিশেষ মামলা আছে grep
জোনাথন লেফলার

39
হিসাবে উল্লেখ করা উত্তর দ্বারা kojiro তার সাথে পাইপলাইন শুরু করার জন্য পুরোপুরি সম্ভব এবং বৈধ < file command1 ...। যদিও I / O পুনর্নির্দেশ অপারেটরগুলির জন্য প্রচলিত অবস্থানটি কমান্ডের নাম এবং তার যুক্তি অনুসারে, এটি কেবল সম্মেলন এবং বাধ্যতামূলক স্থান নয় ment <ফাইলের নাম আগে বসে আছে নেই। সুতরাং, তার মাঝে নিখুঁত প্রতিসাম্য একজন নিকট এর >outputএবং <inputপুনঃনির্দেশগুলি: <input command1 -opt 1 | command2 -o | command3 >output
জোনাথন লেফলার

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

13
অনুগ্র্হ করে বুঝতে চেষ্টা কর; আমি কোনভাবেই catএটি অকেজো বলে বলছি না । এটি catঅকেজো নয়; এটি একটি নির্দিষ্ট নির্মাণ ব্যবহার প্রয়োজন হয় না যে cat। যদি আপনি চান, নোট এটা যে UUoC (এর বেহুদা ব্যবহারের cat), এবং না UoUC (বেহুদা ব্যবহারের cat)। অনেকগুলি উপলক্ষ থাকে যখন catব্যবহারের সঠিক সরঞ্জাম হয়; এটি সঠিকভাবে ব্যবহার করার সঠিক সরঞ্জাম হলে এটি ব্যবহার করার ক্ষেত্রে আমার কোনও সমস্যা নেই (এবং, সত্যই, আমার উত্তরে একটি কেস উল্লেখ করুন)।
জোনাথন লেফলার

6
@ র্যান্ডমস্ট্রিং আমি আপনাকে শুনছি, তবে আমি মনে করি এটি সত্যিই ব্যবহারের ক্ষেত্রে নির্ভর করে। কমান্ড-লাইনের সাহায্যে ব্যবহৃত একটি অতিরিক্ত catপাইপে পারে একটি বড় চুক্তি ডেটার উপর নির্ভর করে, কিন্তু এটা এই কর্মক্ষমতা সমালোচনামূলক কিছু বাস্তবায়ন অত্যাবশ্যক হতে পারে একটি প্রোগ্রামিং পরিবেশ হিসেবে ব্যবহার করা যাবে; বিশেষত bashযা নিয়ে কাজ করার সময়, পারফরম্যান্স-ভিত্তিক, আয়তক্ষেত্রাকার আকৃতির চাকাটির মতো ( kshযাইহোক তুলনায় । আমি এখানে 10x পর্যন্ত আস্তে কথা বলছি - কোন মজা নেই)। আপনি কি আপনার কাটাচামচ (শুধুমাত্র) যে নিখুত যখন বৃহত্তর স্ক্রিপ্ট বা বিশাল লুপ সঙ্গে তার আচরণ চাই।
অ্যাড্রিয়ান ফ্রেহওয়ার্থ

59

নাহ!

প্রথমত, কোনও আদেশে পুনর্নির্দেশটি কোথায় ঘটে তা বিবেচ্য নয়। সুতরাং আপনি যদি আপনার কমান্ডের বাম দিকে আপনার পুনঃনির্দেশ পছন্দ করেন তবে তা ঠিক:

< somefile command

এটার মতই

command < somefile

দ্বিতীয়ত, আপনি যখন পাইপ ব্যবহার করেন তখন এন + 1 প্রক্রিয়া এবং একটি সাবশেল ঘটছে। এটি সবচেয়ে স্থিরভাবে ধীর। কিছু ক্ষেত্রে এন শূন্য হত (উদাহরণস্বরূপ, আপনি যখন শেল বিল্টিনে পুনর্নির্দেশ করছেন), তাই ব্যবহার করে catআপনি অযথা একটি নতুন প্রক্রিয়া যুক্ত করছেন।

একটি সাধারণীকরণ হিসাবে, যখনই আপনি নিজেকে পাইপ ব্যবহার করতে দেখেন এটি 30 সেকেন্ডের জন্য নেওয়া উচিত যদি আপনি এটিকে নির্মূল করতে পারেন কিনা to (তবে সম্ভবত ৩০ সেকেন্ডের বেশি সময় লাগবে না not) এখানে কয়েকটি উদাহরণ রয়েছে যেখানে পাইপ এবং প্রক্রিয়াগুলি প্রায়শই অযথা ব্যবহার করা হয়:

for word in $(cat somefile); … # for word in $(<somefile); … (or better yet, while read < somefile)

grep something | awk stuff; # awk '/something/ stuff' (similar for sed)

echo something | command; # command <<< something (although echo would be necessary for pure POSIX)

আরও উদাহরণ যুক্ত করতে নির্দ্বিধায় সম্পাদনা করুন।


4
ঠিক আছে, গতি বৃদ্ধি খুব বেশি হবে না।
ডাকারন

9
প্রযুক্তিগতভাবে "কমান্ড" এর আগে "<সামফিল" স্থাপন করা আপনাকে বাম থেকে ডান দেয়, তবে এটি কোনও দ্বিধাদ্বন্দ্বের সীমাবদ্ধতা না থাকায় দ্ব্যর্থহীন পাঠের ব্যবস্থা করে: < cat grep dogআপনি ইনপুট ফাইলের মধ্যে সহজেই বলতে পারবেন না এমন একটি নিদর্শন উদাহরণ, কমান্ড যা ইনপুট গ্রহণ করে এবং কমান্ডের সাথে যুক্তি দেয়।
নেক্রোমেন্সার

4
STDIN পুনঃনির্দেশ কোথায় যায় তা সিদ্ধান্ত নেওয়ার জন্য আমি যে নিয়মটি গ্রহণ করেছি তা হ'ল আশ্চর্যতার জন্য অস্পষ্টতা / সম্ভাবনার উপস্থিতি হ্রাস করা যাই হোক না কেন তা করা । কৌতুকপূর্ণভাবে বলা এটি নেক্রোম্যান্সারের সমস্যাটি সামনে আনার আগে চলেছে , তবে কৌতুকপূর্ণভাবে বলা পরে এটি একই কাজ করতে পারে। বিবেচনা করুন: । আরো প্রযোজ্য , অথবা যা, দ্বারা ঘ ' ? উ: এটা প্রযোজ্য , কিন্তু করতে দ্ব্যর্থক প্রদর্শিত হবে। ফেলে সামনে এই ক্ষেত্রে আরো স্পষ্ট, কম প্রচলিত যদিও হয়, এবং পিছনের অনুরূপ । stdout=$(foo bar -exec baz <qux | ENV=VAR quux)<quxfoobaz-execfoofoo<qux fooENV=VAR quux
মার্ক এ।

4
@ এনক্রোমেন্সার, <"cat" grep dogসেখানে পড়া সহজ। (আমি সাধারণত হোয়াইট স্পেস, তবে এই বিশেষ ক্ষেত্রে খুব ব্যতিক্রম)।
চার্লস ডাফি

4
@ কোজিরো "এটি সর্বাধিক স্থিরভাবে ধীর" " সংখ্যার ব্যাক আপ না করে আপনি এটি লিখতে পারবেন না। আমার নম্বরগুলি এখানে রয়েছে: oletange.blogspot.com/2013/10/useless-use-of-cat.html (এবং তারা দেখায় যে এটি কেবল ধীরে ধীরে যখন আপনার উচ্চ ট্রুপপুট থাকে) আপনার কোথায়?
ওলে টেঙে

30

আমি অত্যধিক স্মাগ ইউইওসি অ্যাওয়ার্ডের বেশিরভাগ ক্ষেত্রেই একমত নই কারণ, অন্য কাউকে পড়ানোর সময়, catকোনও কমান্ড বা কমান্ডের ক্রাস্টি জটিল জটিল পাইপলাইন যা সমস্যা বা কাজের জন্য উপযুক্ত আউটপুট উত্পন্ন করে তার জন্য সুবিধাজনক স্থানধারক।

এটি বিশেষত স্ট্যাক ওভারফ্লো, সার্ভারফল্ট, ইউনিক্স এবং লিনাক্স বা এসই সাইটের যে কোনও সাইটের মতো সত্য।

যদি কেউ বিশেষভাবে অপ্টিমাইজেশান সম্পর্কে জিজ্ঞাসা করে, বা আপনি যদি এটি সম্পর্কে অতিরিক্ত তথ্য যুক্ত করার মতো মনে করেন তবে দুর্দান্ত, কীভাবে বিড়াল ব্যবহার করা অক্ষম about সে সম্পর্কে কথা বলুন। তবে মানুষকে হতাশ করবেন না কারণ তারা উদাহরণগুলিতে সরলতা এবং সহজেই বোঝার জন্য তাদের লক্ষ্য বেছে নিয়েছে যে আমাকে দেখার মতো দেখায়! জটিলতা.

সংক্ষেপে, কারণ বিড়াল সবসময় বিড়াল হয় না।

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


হালনাগাদ

এখানে আরও একটি ইউইউসি রয়েছে যা আমি https://unix.stackexchange.com/a/301194/7696 এ একটি উত্তরে পোস্ট করেছি :

sqlq() {
  local filter
  filter='cat'

  # very primitive, use getopts for real option handling.
  if [ "$1" == "--delete-blank-lines" ] ; then
    filter='grep -v "^$"'
    shift
  fi

  # each arg is piped into sqlplus as a separate command
  printf "%s\n" "$@" | sqlplus -S sss/eee@sid | $filter
}

ইউইউসি প্যাডেন্টরা বলবে যে এটি একটি ইউইউসি কারণ এটি $filterখালি স্ট্রিংয়ের উপর ডিফল্ট তৈরি করা সহজেই সম্ভব এবং ifবিবৃতিটি filter='| grep -v "^$"'আইএমও করতে পারে তবে পাইপ চরিত্রটি এম্বেড না করে $filterএই "অকেজো" catসত্যকে স্বতঃ-দলিলকরণের অত্যন্ত দরকারী উদ্দেশ্যে কাজ করে যে $filterউপর printfলাইন শুধু আরেকটি যুক্তি নয় sqlplus, এটি একটি ঐচ্ছিক ব্যবহারকারী-নির্বাচনযোগ্য আউটপুট ফিল্টার আছে।

যদি একাধিক alচ্ছিক আউটপুট ফিল্টারগুলির দরকার পড়ে তবে অপশন প্রসেসিংটি প্রয়োজন হিসাবে প্রায়শই সংযোজন | whateverকরতে পারে $filter- catপাইপলাইনে আরও একটি অতিরিক্ত কোনও ক্ষতি করতে পারে না বা পারফরম্যান্সের কোনও লক্ষণীয় ক্ষতি হতে পারে না।


12
একপাশে হিসাবে - ==ভিতরে [ ]পসিক্স দ্বারা নির্দিষ্ট করা হয়নি, এবং সমস্ত বাস্তবায়ন এটি গ্রহণ করে না। মানক অপারেটর ঠিক =
চার্লস ডাফি

27

ইউইউসি সংস্করণ সহ, catফাইলটি মেমরির মধ্যে পড়তে হবে, তারপরে পাইপটিতে লিখতে হবে এবং কমান্ডটি পাইপ থেকে ডেটা পড়তে হবে, তাই কার্নেলটিকে তিনবার পুরো ফাইলটি অনুলিপি করতে হবে যেখানে পুনঃনির্দেশিত ক্ষেত্রে, কার্নেলটি কেবল একবার ফাইলটি অনুলিপি করতে হবে। তিনবার করার চেয়ে একবার কিছু করা দ্রুত হয়।

ব্যবহার:

cat "$@" | command

এটি সম্পূর্ণ আলাদা এবং অকারণে অকার্যকর ব্যবহার নয় cat। কমান্ডটি এমন একটি স্ট্যান্ডার্ড ফিল্টার যা শূন্য বা আরও বেশি ফাইল নাম যুক্তিগুলি গ্রহণ করে এবং পরিবর্তে তাদের প্রক্রিয়া করে তবে এটি এখনও অকেজো। trকমান্ডটি বিবেচনা করুন : এটি একটি খাঁটি ফিল্টার যা ফাইল নাম যুক্তি উপেক্ষা করে বা প্রত্যাখ্যান করে। এটিতে একাধিক ফাইল ফিড করতে আপনাকে catপ্রদর্শিত হিসাবে ব্যবহার করতে হবে। (অবশ্যই, trএটির একটি পৃথক আলোচনা রয়েছে যেটির নকশা খুব ভাল নয়; এটি কোনও স্ট্যান্ডার্ড ফিল্টার হিসাবে নকশা করা যেতে পারে এমন কোনও আসল কারণ নেই)) আপনি যদি সমস্ত ইনপুটটিকে একটি হিসাবে বিবেচনা করার আদেশটি চান তবে এটি বৈধও হতে পারে একক ফাইল একাধিক পৃথক পৃথক ফাইলের পরিবর্তে, এমনকি যদি কমান্ডটি একাধিক পৃথক ফাইল গ্রহণ করে: উদাহরণস্বরূপ, wcএই জাতীয় কমান্ড।

এটি cat single-fileনিঃশর্তভাবে অকেজো বিষয়।


27

ইন প্রতিরক্ষা বিড়াল:

হ্যাঁ,

   < input process > output 

বা

   process < input > output 

আরও দক্ষ, তবে অনেকগুলি অনুরোধের পারফরম্যান্সের সমস্যা নেই, সুতরাং আপনার যত্ন নেই।

শ্রুতিবদ্ধ কারণ:

আমরা বাম থেকে ডানে পড়তে অভ্যস্ত, তাই একটি কমান্ড পছন্দ করে

    cat infile | process1 | process2 > outfile

বুঝতে তুচ্ছ।

    process1 < infile | process2 > outfile

প্রসেস 1-এ ঝাঁপিয়ে পড়তে হবে এবং তারপরে বাম থেকে ডানে পড়তে হবে। এটির মাধ্যমে নিরাময় করা যায়:

    < infile process1 | process2 > outfile

একরকম দেখে মনে হচ্ছে যেন বাম দিকে ইশারা করে এমন একটি তীর রয়েছে যেখানে কিছুই নেই। অভিনব উদ্ধৃতিগুলির মতো আরও বিভ্রান্তিকর এবং চেহারা দেখাচ্ছে:

    process1 > outfile < infile

এবং স্ক্রিপ্ট তৈরি করা প্রায়শই একটি পুনরাবৃত্তি প্রক্রিয়া,

    cat file 
    cat file | process1
    cat file | process1 | process2 
    cat file | process1 | process2 > outfile

যেখানে আপনি আপনার অগ্রগতিটি ধাপে ধাপে দেখুন

    < file 

এমনকি কাজ করে না। সহজ উপায়গুলি কম ত্রুটিযুক্ত প্রবণ এবং বিড়ালের সাথে এর্গোনমিক কমান্ড ক্যাটেনেশন সহজ।

আরেকটি বিষয় হ'ল, বেশিরভাগ লোকেরা> এবং << তুলনা অপারেটর হিসাবে প্রকাশিত হয়েছিল, কম্পিউটার ব্যবহারের অনেক আগে এবং কম্পিউটারটিকে প্রোগ্রামার হিসাবে ব্যবহার করার সময়, এগুলি প্রায়শই প্রকাশিত হয়।

এবং <এবং> এর সাথে দুটি অপারেটের তুলনা বিপরীত পরিবর্তন, যার অর্থ

(a > b) == (b < a)

আমি মনে করি প্রথমবার <ইনপুট পুনঃনির্দেশের জন্য ব্যবহার করে, আমার ভয় হয়েছিল

a.sh < file 

একই হিসাবে বোঝাতে পারে

file > a.sh

এবং কোনওভাবে আমার a.sh স্ক্রিপ্টটি ওভাররাইট করুন। হয়তো এটি অনেক নতুনদের জন্য একটি সমস্যা।

বিরল পার্থক্য

wc -c journal.txt
15666 journal.txt
cat journal.txt | wc -c 
15666

পরবর্তীগুলি সরাসরি গণনায় ব্যবহৃত হতে পারে।

factor $(cat journal.txt | wc -c)

অবশ্যই ফাইলের প্যারামিটারের পরিবর্তে <এখানেও ব্যবহার করা যেতে পারে:

< journal.txt wc -c 
15666
wc -c < journal.txt
15666
    

তবে কে খেয়াল করে - 15 কে?

আমি যদি মাঝে মধ্যে ইস্যুতে দৌড়াতাম তবে অবশ্যই আমি বিড়ালটিকে ডাকার অভ্যাসটি পরিবর্তন করব।

খুব বড় বা অনেকগুলি, অনেক ফাইল ব্যবহার করার সময় বিড়াল এড়ানো ঠিক আছে। বেশিরভাগ প্রশ্নের কাছে বিড়ালের ব্যবহার অর্থোথোনাল, বিষয় ছাড়াই, কোনও সমস্যা নয়।

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


6
+11111 .. বর্তমানে গৃহীত উত্তরের লেখক হিসাবে, আমি অত্যন্ত এই আনন্দদায়ক পরিপূরকটির প্রস্তাব দিই। সুনির্দিষ্ট উদাহরণগুলি আমার প্রায়শ বিমূর্ত এবং কথায় কথায় যুক্তি উপস্থাপন করে এবং লেখকের প্রথম কৌতুক থেকে আপনি যে হাসি পেয়েছেন তা এই সময়টুকু file > a.shপড়ার মতো নয় :) ভাগ করে নেওয়ার জন্য ধন্যবাদ!
নেক্রোমেন্সার

এই অনুরোধে cat file | wc -c, wcEOF অবধি স্টেডিন পড়তে হবে, গণনা বাইট। তবে wc -c < fileএটিতে, এটি কেবল স্টিডিনের পরিসংখ্যান করে এটি কোনও নিয়মিত ফাইল এবং কোনও ইনপুট না পড়ার পরিবর্তে st_size মুদ্রণ করে finds একটি বড় ফাইলের জন্য পারফরম্যান্সের পার্থক্য পরিষ্কারভাবে দৃশ্যমান হবে।
ওগুজ ইসমাইল

18

একটি অতিরিক্ত সমস্যা হ'ল পাইপটি নিঃশব্দে একটি সাব-শেল মাস্ক করতে পারে। এই উদাহরণে জন্য, আমি প্রতিস্থাপন করব catসঙ্গে echo, কিন্তু একই সমস্যা বিদ্যমান।

echo "foo" | while read line; do
    x=$line
done

echo "$x"

আপনি থাকতে পারে আশা xকরতে পারেন foo, কিন্তু এটি না। xএকটি subshell চালানো উত্পন্ন হওয়া আপনি সেট ছিল whileলুপ। xপাইপলাইনটি শুরু হওয়া শেলটিতে একটি অপ্রাসঙ্গিক মান রয়েছে, বা এটি সেট করা নেই।

Bash4 এ, আপনি কয়েকটি শেল বিকল্পগুলি কনফিগার করতে পারেন যাতে পাইপলাইনের শেষ কমান্ডটি পাইপলাইন শুরু হওয়া একই শেলের মধ্যে সঞ্চালিত হয়, তবে তারপরে আপনি এটি চেষ্টা করতে পারেন

echo "foo" | while read line; do
    x=$line
done | awk '...'

এবং xএটি আবার whileসাবসেলের কাছে স্থানীয় ।


5
কঠোরভাবে পসিক্স শেলের মধ্যে এটি একটি জটিল সমস্যা হতে পারে কারণ পাইপ এড়ানোর জন্য আপনার কাছে স্ট্রিং বা প্রক্রিয়া বিকল্প নেই। বাশফ্যাক্যা 24 এর কিছু কার্যকর সমাধান রয়েছে সেই ক্ষেত্রেও।
কোজিরো

4
ইন কিছু শাঁস, ইলাস্ট্রেটেড পাইপ হল subshell তৈরি করে না। উদাহরণগুলিতে কর্ন এবং জেড অন্তর্ভুক্ত রয়েছে They তারা প্রক্রিয়া বিকল্প এবং এখানে স্ট্রিংগুলি সমর্থন করে support অবশ্যই তারা কঠোরভাবে পসিক্স নয়। বাশ 4 shopt -s lastpipeসাব-শেল তৈরি করা এড়াতে হবে।
পরবর্তী বিজ্ঞপ্তি না হওয়া পর্যন্ত বিরতি দেওয়া হয়েছে।

14

যে কেউ নিয়মিত এটি এবং অন্যান্য বেশ কয়েকটি শেল প্রোগ্রামিং এন্টিপ্যাটার্নগুলি উল্লেখ করে, আমি নিজেকে বিরক্ত হতে বাধ্য হতে পারি weigh

শেল স্ক্রিপ্ট অনেকটা অনুলিপি / পেস্টের ভাষা। বেশিরভাগ লোক যারা শেল স্ক্রিপ্ট লেখেন, তারা ভাষা শিখতে এতে নেই; এটি ভাষায় (ओं) কাজগুলি চালিয়ে যেতে তারা কেবলমাত্র একটি বাধা অতিক্রম করতে পারে যা তারা আসলে কিছুটা পরিচিত।

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

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

ইউইউসিএ এবং সম্পর্কিত অ্যান্টিপ্যাটার্ন মন্তব্যগুলি কেবলমাত্র আমরা মন্তব্য করি সেই কোডটির লেখকদের জন্য নয়; সাইটের পাঠকদের তারা এখানে খুঁজে পাওয়া কোডটিতে সমস্যা সম্পর্কে সচেতন হতে সহায়তা করার জন্য তারা যতটা সচেতন সম্রাট

আমরা এমন পরিস্থিতি অর্জনের আশা করতে পারি না যেখানে স্ট্যাক ওভারফ্লোতে কোনও উত্তরই অকেজো cat(বা অব্যক্ত ভেরিয়েবল, বা chmod 777, বা অন্যান্য অ্যান্টিপ্যাটার্ন প্লেগগুলির বৃহত বিভিন্ন) প্রস্তাব দেয় না, তবে আমরা অনুলিপি / অনুলিপি করতে থাকা ব্যবহারকারীকে শিক্ষিত করতে সহায়তা করতে পারি / এই কোডটি তাদের স্ক্রিপ্টের অন্তঃস্থতম টান লুপে পেস্ট করুন যা কয়েক মিলিয়ন বার কার্যকর করে।

প্রযুক্তিগত কারণ হিসাবে যতটা যায়, traditionalতিহ্যগত বুদ্ধি হ'ল আমাদের বাহ্যিক প্রক্রিয়াগুলির সংখ্যা হ্রাস করার চেষ্টা করা উচিত; শেল স্ক্রিপ্টগুলি লেখার সময় এটি একটি ভাল সাধারণ দিকনির্দেশনা হিসাবে ধরে রাখে।


4
এছাড়াও বড় ফাইলগুলির জন্য, পাইপিং করা catহ'ল অতিরিক্ত অতিরিক্ত প্রসঙ্গ সুইচ এবং মেমরি ব্যান্ডউইদথ (এবং cat'র রিড বাফার, এবং পাইপ বাফারগুলিতে ডেটার অতিরিক্ত কপি থেকে এল 3 ক্যাশে দূষণ )) বিশেষত একটি বড় মাল্টি-কোর মেশিনে (অনেকগুলি হোস্টিং সেটআপের মতো) ক্যাশে / মেমরির ব্যান্ডউইথ একটি ভাগ করা সংস্থান।
পিটার কর্ডস

4
@ পিটারকর্ডস দয়া করে আপনার পরিমাপ পোস্ট করুন। এটি বাস্তবে গুরুত্বপূর্ণ যদি আমরা এটি করতে পারি। আমার অভিজ্ঞতাটি হ'ল এটি সাধারণতঃ কিছু যায় আসে না: oletange.blogspot.com/2013/10/useless-use-of-cat.html
ওলে

4
আপনার নিজস্ব ব্লগটি হাই-থ্রুপুটটির জন্য 50% ধীরগতি দেখায় এবং আপনি মোট থ্রুপুটটির উপর প্রভাবও দেখছেন না (যদি আপনি অন্যান্য কোরগুলিকে ব্যস্ত রেখে জিনিস রাখেন)। যদি আমি এটির কাছাকাছি যাই, x264 বা x265 সমস্ত কোর ব্যবহার করে কোনও ভিডিও এনকোডিং করার সময় আমি আপনার পরীক্ষাগুলি চালাতে পারি এবং ভিডিও এনকোডিংটি এটি কতটা ধীর করে দেয় তা দেখুন। bzip2এবং gzipকম্প্রেশন উভয় খুব ধীর তুলনা করা হয় ওভারহেড পরিমাণ cat(মেশিন অন্যথায় অলস সঙ্গে) যে একা যোগ করা হয়েছে। আপনার টেবিলগুলি পড়া (কোনও সংখ্যার মাঝখানে রেখা মোড়ানো)? sysসময় অনেক বেড়ে যায়, কিন্তু এখনও ছোট বনাম ব্যবহারকারী বা বাস্তব?
পিটার কর্ডেস

8

আমি প্রায়শই cat file | myprogramউদাহরণগুলিতে ব্যবহার করি । কখনও কখনও আমার বিরুদ্ধে বিড়ালের অকেজো ব্যবহারের অভিযোগ আনা হচ্ছে ( http://porkmail.org/era/unix/award.html )। আমি নিম্নলিখিত কারণগুলির সাথে একমত নই:

  • কী চলছে তা বোঝা সহজ।

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

    cat foo | program1 -o option -b option | program2
    

    চেয়ে পড়া সহজ

    program1 -o option -b option < foo | program2
    

    আপনি যদি পুনঃনির্দেশটি শুরুতে সরিয়ে নিয়ে যান তবে আপনি এমন মানুষকে বিভ্রান্ত করছেন যারা এই সিনট্যাক্সটিতে অভ্যস্ত নয়:

    < foo program1 -o option -b option | program2
    

    এবং উদাহরণগুলি বুঝতে সহজ হওয়া উচিত।

  • এটি পরিবর্তন করা সহজ।

    আপনি যদি জানেন যে প্রোগ্রামটি পড়তে catপারে তবে আপনি সাধারণত ধরে নিতে পারেন যে এটি যে কোনও প্রোগ্রামের স্টপ আউটপুট থেকে আউটপুট পড়তে পারে এবং এইভাবে আপনি এটি আপনার নিজের প্রয়োজনের জন্য খাপ খাইয়ে নিতে পারেন এবং ভবিষ্যদ্বাণীমূলক ফলাফল পেতে পারেন।

  • এটি জোর দেয় যে প্রোগ্রামটি ব্যর্থ হয় না, যদি STDIN কোনও ফাইল না হয়।

    এটি যদি program1 < fooকাজ করে তবে কাজ cat foo | program1করবে তা ধরে নেওয়া নিরাপদ নয় । তবে এটি বিপরীতে ধরে নেওয়া নিরাপদ। এই প্রোগ্রামটি যদি STDIN কোনও ফাইল হয় তবে এটি ইনপুটটি পাইপ হলে ব্যর্থ হয়, কারণ এটি সন্ধান করে:

    # works
    < foo perl -e 'seek(STDIN,1,1) || die;print <STDIN>'
    
    # fails
    cat foo | perl -e 'seek(STDIN,1,1) || die;print <STDIN>'
    

পারফরম্যান্স ব্যয়

অতিরিক্ত করার জন্য একটি খরচ আছে cat। বেসলাইন ( cat), নিম্ন থ্রুপুট ( bzip2), মাঝারি থ্রুপুট ( gzip), এবং উচ্চ থ্রুপুট ( grep) অনুকরণ করতে আমি কতগুলি পরীক্ষা চালিয়েছি তার একটি ধারণা দিতে ।

cat $ISO | cat
< $ISO cat
cat $ISO | bzip2
< $ISO | bzip2
cat $ISO | gzip
< $ISO gzip
cat $ISO | grep no_such_string
< $ISO grep no_such_string

পরীক্ষাগুলি নিম্ন প্রান্তের সিস্টেমে (0.6 গিগাহার্টজ) এবং একটি সাধারণ ল্যাপটপ (2.2 গিগাহার্টজ) এ চালানো হয়েছিল। এগুলি প্রতিটি সিস্টেমে 10 বার চালানো হয়েছিল এবং প্রতিটি পরীক্ষার অনুকূল পরিস্থিতি অনুকরণের জন্য সেরা সময় বেছে নেওয়া হয়েছিল। $ আইএসওটি ছিল উবুন্টু -11.04-ডেস্কটপ-i386.iso। (এখানে সুন্দর টেবিলগুলি: http://oletange.blogspot.com/2013/10/useless-use-of-cat.html )

CPU                       0.6 GHz ARM
Command                   cat $ISO|                        <$ISO                            Diff                             Diff (pct)
Throughput \ Time (ms)    User       Sys        Real       User       Sys        Real       User       Sys        Real       User       Sys        Real
Baseline (cat)                     55      14453      33090         23       6937      33126         32       7516        -36        239        208         99
Low (bzip2)                   1945148      16094    1973754    1941727       5664    1959982       3420      10430      13772        100        284        100
Medium (gzip)                  413914      13383     431812     407016       5477     416760       6898       7906      15052        101        244        103
High (grep no_such_string)      80656      15133      99049      79180       4336      86885       1476      10797      12164        101        349        114

CPU                       Core i7 2.2 GHz
Command                   cat $ISO|           <$ISO             Diff          Diff (pct)
Throughput \ Time (ms)    User     Sys Real   User   Sys Real   User Sys Real User       Sys Real
Baseline (cat)                    0 356    215      1  84     88    0 272  127          0 423  244
Low (bzip2)                  136184 896 136765 136728 160 137131 -545 736 -366         99 560   99
Medium (gzip)                 26564 788  26791  26332 108  26492  232 680  298        100 729  101
High (grep no_such_string)      264 392    483    216  84    304   48 308  179        122 466  158

ফলাফলগুলি দেখায় যে কম এবং মাঝারি মাধ্যমে আউটপুটটির জন্য ব্যয় 1% এর ক্রম হয়। এটি পরিমাপের অনিশ্চয়তার মধ্যে ভাল, সুতরাং বাস্তবে কোনও পার্থক্য নেই।

হাই থ্রুপুট জন্য পার্থক্য বড় এবং উভয়ের মধ্যে একটি স্পষ্ট পার্থক্য আছে।

এটি সিদ্ধান্তে পৌঁছায়: আপনার <পরিবর্তে ব্যবহার করা উচিত cat |যদি:

  • প্রসেসিংয়ের জটিলতা একটি সাধারণ গ্রেপের সমান
  • কর্মক্ষমতা পাঠযোগ্যতার চেয়ে বেশি গুরুত্বপূর্ণ।

অন্যথায় আপনি ব্যবহার করেন <বা ব্যবহার করেন তা বিবেচ্য নয় cat |

এবং এইভাবে আপনার কেবলমাত্র একটি ইউইউসি-পুরস্কার দেওয়া উচিত যদি কেবলমাত্র:

  • আপনি পারফরম্যান্সের একটি গুরুত্বপূর্ণ পার্থক্য পরিমাপ করতে পারেন (পুরষ্কার দেওয়ার সময় আপনার পরিমাপগুলি প্রকাশ করুন)
  • কর্মক্ষমতা পাঠযোগ্যতার চেয়ে বেশি গুরুত্বপূর্ণ।

-3

আমি মনে করি যে পাইপ ব্যবহার করা (traditionalতিহ্যবাহী উপায়) কিছুটা বেশি দ্রুত; আমার বাক্সে আমি straceকমান্ড ব্যবহার করে যা চলছে তা দেখতে:

পাইপ ছাড়াই:

toc@UnixServer:~$ strace wc -l < wrong_output.c
execve("/usr/bin/wc", ["wc", "-l"], [/* 18 vars */]) = 0
brk(0)                                  = 0x8b50000
access("/etc/ld.so.nohwcap", F_OK)      = -1 ENOENT (No such file or directory)
mmap2(NULL, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0xb77ad000
access("/etc/ld.so.preload", R_OK)      = -1 ENOENT (No such file or directory)
open("/etc/ld.so.cache", O_RDONLY)      = 3
fstat64(3, {st_mode=S_IFREG|0644, st_size=29107, ...}) = 0
mmap2(NULL, 29107, PROT_READ, MAP_PRIVATE, 3, 0) = 0xb77a5000
close(3)                                = 0
access("/etc/ld.so.nohwcap", F_OK)      = -1 ENOENT (No such file or directory)
open("/lib/i386-linux-gnu/libc.so.6", O_RDONLY) = 3
read(3, "\177ELF\1\1\1\0\0\0\0\0\0\0\0\0\3\0\3\0\1\0\0\0p\222\1\0004\0\0\0"..., 512) = 512
fstat64(3, {st_mode=S_IFREG|0755, st_size=1552584, ...}) = 0
mmap2(NULL, 1563160, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0xb7627000
mmap2(0xb779f000, 12288, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x178) = 0xb779f000
mmap2(0xb77a2000, 10776, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0) = 0xb77a2000
close(3)                                = 0
mmap2(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0xb7626000
set_thread_area({entry_number:-1 -> 6, base_addr:0xb76268d0, limit:1048575, seg_32bit:1, contents:0, read_exec_only:0, limit_in_pages:1, seg_not_present:0, useable:1}) = 0
mprotect(0xb779f000, 8192, PROT_READ)   = 0
mprotect(0x804f000, 4096, PROT_READ)    = 0
mprotect(0xb77ce000, 4096, PROT_READ)   = 0
munmap(0xb77a5000, 29107)               = 0
brk(0)                                  = 0x8b50000
brk(0x8b71000)                          = 0x8b71000
open("/usr/lib/locale/locale-archive", O_RDONLY|O_LARGEFILE) = 3
fstat64(3, {st_mode=S_IFREG|0644, st_size=5540198, ...}) = 0
mmap2(NULL, 2097152, PROT_READ, MAP_PRIVATE, 3, 0) = 0xb7426000
mmap2(NULL, 1507328, PROT_READ, MAP_PRIVATE, 3, 0x2a8) = 0xb72b6000
close(3)                                = 0
open("/usr/share/locale/locale.alias", O_RDONLY) = 3
fstat64(3, {st_mode=S_IFREG|0644, st_size=2570, ...}) = 0
mmap2(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0xb77ac000
read(3, "# Locale name alias data base.\n#"..., 4096) = 2570
read(3, "", 4096)                       = 0
close(3)                                = 0
munmap(0xb77ac000, 4096)                = 0
open("/usr/share/locale/fr_FR.UTF-8/LC_MESSAGES/coreutils.mo", O_RDONLY) = -1 ENOENT (No such file or directory)
open("/usr/share/locale/fr_FR.utf8/LC_MESSAGES/coreutils.mo", O_RDONLY) = -1 ENOENT (No such file or directory)
open("/usr/share/locale/fr_FR/LC_MESSAGES/coreutils.mo", O_RDONLY) = -1 ENOENT (No such file or directory)
open("/usr/share/locale/fr.UTF-8/LC_MESSAGES/coreutils.mo", O_RDONLY) = -1 ENOENT (No such file or directory)
open("/usr/share/locale/fr.utf8/LC_MESSAGES/coreutils.mo", O_RDONLY) = -1 ENOENT (No such file or directory)
open("/usr/share/locale/fr/LC_MESSAGES/coreutils.mo", O_RDONLY) = -1 ENOENT (No such file or directory)
open("/usr/share/locale-langpack/fr_FR.UTF-8/LC_MESSAGES/coreutils.mo", O_RDONLY) = -1 ENOENT (No such file or directory)
open("/usr/share/locale-langpack/fr_FR.utf8/LC_MESSAGES/coreutils.mo", O_RDONLY) = -1 ENOENT (No such file or directory)
open("/usr/share/locale-langpack/fr_FR/LC_MESSAGES/coreutils.mo", O_RDONLY) = -1 ENOENT (No such file or directory)
open("/usr/share/locale-langpack/fr.UTF-8/LC_MESSAGES/coreutils.mo", O_RDONLY) = -1 ENOENT (No such file or directory)
open("/usr/share/locale-langpack/fr.utf8/LC_MESSAGES/coreutils.mo", O_RDONLY) = -1 ENOENT (No such file or directory)
open("/usr/share/locale-langpack/fr/LC_MESSAGES/coreutils.mo", O_RDONLY) = 3
fstat64(3, {st_mode=S_IFREG|0644, st_size=316721, ...}) = 0
mmap2(NULL, 316721, PROT_READ, MAP_PRIVATE, 3, 0) = 0xb7268000
close(3)                                = 0
open("/usr/lib/i386-linux-gnu/gconv/gconv-modules.cache", O_RDONLY) = 3
fstat64(3, {st_mode=S_IFREG|0644, st_size=26064, ...}) = 0
mmap2(NULL, 26064, PROT_READ, MAP_SHARED, 3, 0) = 0xb7261000
close(3)                                = 0
read(0, "#include<stdio.h>\n\nint main(int "..., 16384) = 180
read(0, "", 16384)                      = 0
fstat64(1, {st_mode=S_IFCHR|0620, st_rdev=makedev(136, 2), ...}) = 0
mmap2(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0xb7260000
write(1, "13\n", 313
)                     = 3
close(0)                                = 0
close(1)                                = 0
munmap(0xb7260000, 4096)                = 0
close(2)                                = 0
exit_group(0)                           = ?

এবং পাইপ সহ:

toc@UnixServer:~$ strace cat wrong_output.c | wc -l
execve("/bin/cat", ["cat", "wrong_output.c"], [/* 18 vars */]) = 0
brk(0)                                  = 0xa017000
access("/etc/ld.so.nohwcap", F_OK)      = -1 ENOENT (No such file or directory)
mmap2(NULL, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0xb774b000
access("/etc/ld.so.preload", R_OK)      = -1 ENOENT (No such file or directory)
open("/etc/ld.so.cache", O_RDONLY)      = 3
fstat64(3, {st_mode=S_IFREG|0644, st_size=29107, ...}) = 0
mmap2(NULL, 29107, PROT_READ, MAP_PRIVATE, 3, 0) = 0xb7743000
close(3)                                = 0
access("/etc/ld.so.nohwcap", F_OK)      = -1 ENOENT (No such file or directory)
open("/lib/i386-linux-gnu/libc.so.6", O_RDONLY) = 3
read(3, "\177ELF\1\1\1\0\0\0\0\0\0\0\0\0\3\0\3\0\1\0\0\0p\222\1\0004\0\0\0"..., 512) = 512
fstat64(3, {st_mode=S_IFREG|0755, st_size=1552584, ...}) = 0
mmap2(NULL, 1563160, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0xb75c5000
mmap2(0xb773d000, 12288, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x178) = 0xb773d000
mmap2(0xb7740000, 10776, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0) = 0xb7740000
close(3)                                = 0
mmap2(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0xb75c4000
set_thread_area({entry_number:-1 -> 6, base_addr:0xb75c48d0, limit:1048575, seg_32bit:1, contents:0, read_exec_only:0, limit_in_pages:1, seg_not_present:0, useable:1}) = 0
mprotect(0xb773d000, 8192, PROT_READ)   = 0
mprotect(0x8051000, 4096, PROT_READ)    = 0
mprotect(0xb776c000, 4096, PROT_READ)   = 0
munmap(0xb7743000, 29107)               = 0
brk(0)                                  = 0xa017000
brk(0xa038000)                          = 0xa038000
open("/usr/lib/locale/locale-archive", O_RDONLY|O_LARGEFILE) = 3
fstat64(3, {st_mode=S_IFREG|0644, st_size=5540198, ...}) = 0
mmap2(NULL, 2097152, PROT_READ, MAP_PRIVATE, 3, 0) = 0xb73c4000
mmap2(NULL, 1507328, PROT_READ, MAP_PRIVATE, 3, 0x2a8) = 0xb7254000
close(3)                                = 0
fstat64(1, {st_mode=S_IFIFO|0600, st_size=0, ...}) = 0
open("wrong_output.c", O_RDONLY|O_LARGEFILE) = 3
fstat64(3, {st_mode=S_IFREG|0664, st_size=180, ...}) = 0
read(3, "#include<stdio.h>\n\nint main(int "..., 32768) = 180
write(1, "#include<stdio.h>\n\nint main(int "..., 180) = 180
read(3, "", 32768)                      = 0
close(3)                                = 0
close(1)                                = 0
close(2)                                = 0
exit_group(0)                           = ?
13

আপনি ভাল বেঞ্চমার্কিংয়ের জন্য আরও দীর্ঘতর কমান্ডের সাহায্যে কিছু পরীক্ষা করতে পারেন straceএবং timeকমান্ড করতে পারেন ।


10
পাইপ ব্যবহার করে আপনি কী বোঝাতে চেয়েছিলেন তা (বা গতানুগতিক পদ্ধতিতে) বুঝতে পারছি না বা কেন আপনি straceএটির দ্রুত দেখায় তা - এটি দ্বিতীয় ক্ষেত্রে মৃত্যুদন্ড কার্যকর straceকরছে না wc -l। এটি কেবল পাইপলাইনের প্রথম কমান্ডটি এখানে সন্ধান করে।
কোজিরো

@ কোজিরো: আমি চিরাচরিত উপায়ে = সবচেয়ে বেশি ব্যবহৃত পদ্ধতিতে (আমার মনে হয় যে আমরা পাইপকে ইন্ডিরিশনের চেয়ে বেশি ব্যবহার করি), আমি নিশ্চিত করতে পারি না যে এটি দ্রুত বা না, আমার সন্ধানে আমি ইন্ডিরেশনের জন্য আরও সিস্টেম কল দেখেছি। আপনি আরও বেশি সময় ব্যয় করে এটি দেখতে এসি প্রোগ্রাম এবং একটি লুপ ব্যবহার করতে পারেন। আপনি যদি আগ্রহী হন তবে আমরা এটি এখানে রাখতে পারি :)
TOC

4
একটি আপেল থেকে আপেল তুলনা strace -f sh -c 'wc -l < wrong_output.c'পাশাপাশি রাখা হবে strace -f sh -c 'cat wrong_output.c | wc -l'
চার্লস ডাফি

5
আইডোন.কম থেকে প্রাপ্ত ফলাফলগুলি এখানে রয়েছে যা বর্তমানে স্পষ্টতই ছাড়াই পক্ষে cat: আদর্শ one.com/2w1W42#stderr
ট্রিপলি

4
@ চার্লসডুফি: mkfifoএকটি নামযুক্ত পাইপ তৈরি করে । একটি বেনামে পাইপ স্থাপন করা হয় pipe(2)এবং তারপরে কাঁটাচামচ করা হয়, এবং পিতামাতার এবং সন্তানের পাইপের বিভিন্ন প্রান্তটি বন্ধ করে দেওয়া হয়। তবে হ্যাঁ, এই উত্তরটি সম্পূর্ণ বোকামি, এবং এমনকি সিস্টেম কলগুলি গণনা করতে বা strace -Oওভারহেড পরিমাপ -rকরতে বা শেষের সাথে সম্পর্কিত প্রতিটি কলকে টাইমস্ট্যাম্প করার চেষ্টা করেনি ...
পিটার কর্ডস
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.