"বিড়ালের অকেজো ব্যবহার" সম্পর্কে সাধারণ Whatকমত্য কী?


41

যখন আমি একাধিক ইউনিক্স কমান্ডগুলি যেমন গ্রাইপ, সেড, টিআর ইত্যাদি পাইপ করি তখন আমি বিড়াল ব্যবহার করে প্রক্রিয়াধীন হওয়া ইনপুট ফাইলটি নির্দিষ্ট করতে পারি। তাই কিছু cat file | grep ... | awk ... | sed ...

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

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

আমি যে নিকটতম প্রশ্নটি এখানে দেখতে পেয়েছি তা হ'ল : বিড়াল বলা কি অপচয়? - তবে আমি যা বলছি তা পুরোপুরি নয়।

আমি অনুমান করি যে ইউইউসি ক্যাম্পটি কী ব্যবহার করবে cmd1 args < file | cmd2 args | cmd3 ..বা কমান্ডের যদি ফাইল থেকে পড়ার বিকল্প থাকে তবে আর্গুমেন্ট হিসাবে ফাইলটি পাস করতে হবে pass

তবে আমার cat file | cmd1 ... | cmd2কাছে পড়া ও বুঝতে অনেক সহজ মনে হয়েছে। আমাকে বিভিন্ন কমান্ডে ইনপুট ফাইল প্রেরণের বিভিন্ন উপায় মনে করতে হবে না এবং প্রক্রিয়াটি লজিকভাবে বাম থেকে ডানে প্রবাহিত হবে। প্রথম ইনপুট, তারপরে প্রথম প্রক্রিয়া ... এবং আরও অনেক কিছু।

বিড়ালের অকেজো ব্যবহার সম্পর্কে কী যুক্তি দেওয়া হচ্ছে তা আমি বুঝতে ব্যর্থ হয়েছি? আমি বুঝতে পারি যে যদি আমি ক্রোন জব চালাচ্ছি যা প্রতি 2 সেকেন্ডে চলে যা প্রচুর পরিমাণে প্রক্রিয়াজাত করে, তবে সেই ক্ষেত্রে বিড়ালটি অপচয়যোগ্য হতে পারে। তবে অন্যথায় বিড়াল ব্যবহারের বিষয়ে সাধারণ what'sকমত্য কী?


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

4
সাধারণ sensক্যমত্য হ'ল যে noক্যমত হয় না।
jwg

2
এটি মূলত স্ট্যাকওভারফ্লো.com / qtions / 11710552 / useless-use-of-cat নকল করে (যদিও এটি এর পূর্বে রয়েছে)।
ট্রিপলি

1
< file cmd1 args | cmd2 args ...এটিও কার্যকর হয় তা ভুলে যাবেন না ... সুতরাং আপনার " বাম থেকে ডান " যুক্তিটি বাতিল। আমি প্রায়শই এটি পরিষ্কারতার জন্য ব্যবহার করি - আমি যে আদেশটি দেখিয়েছি তাতে লোকেরা বিরতি দিতে পারে, যা ভাল নয়। উচ্চতর থ্রেড গণনাটি আদর্শ হয়ে ওঠার সাথে সাথে এটি ইস্যুটির চেয়ে কম হয়ে উঠছে আইএমও ...
এট্টি

উত্তর:


21

এই অর্থে এটি অকেজো যে এটির মতো এটি ব্যবহার করা অন্য কোনও কিছুই অর্জন করে না, সম্ভবত আরও দক্ষ বিকল্পগুলি পারে না (অর্থাত্ যথাযথ ফলাফল উত্পাদন করে)।

কিন্তু catউপায় চেয়ে আরও শক্তিশালী cat somefileএই উত্তরে আমি যা লিখেছি তা পরামর্শ করুন man catবা পড়ুন । তবে যদি আপনার একেবারে ইতিবাচকভাবে কেবল একটি একক ফাইলের বিষয়বস্তুর প্রয়োজন হয় তবে আপনি ফাইলের বিষয়বস্তু না পেয়ে ব্যবহারকারীর কিছুটা সুবিধা পেতে পারেন।cat

পঠনযোগ্যতা সম্পর্কে, এটি আপনার ব্যক্তিগত স্বাদের উপর নির্ভর করে। আমি catএকই কারণে অন্যান্য কমান্ডগুলিতে ফাইলগুলি ING পছন্দ করি , বিশেষত যদি পারফরম্যান্সের দিকগুলি নগণ্য হয়।

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


3
পারফরম্যান্স ব্যয় কি নগণ্য? অনেক ক্ষেত্রে তারা হ'ল
ওলে

15

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

রাবারটি যেখানে রাস্তার সাথে মিলিত তা হ'ল ভাল অভ্যাস গঠন এবং খারাপ অভ্যাসকে নিরুৎসাহিত করা। একটি ছাঁচযুক্ত ক্লিচকে টেনে আনতে, শয়তানটি বিশদে রয়েছে। এবং এটি এর মতো বিশদ যা মহান থেকে মধ্যস্থকে পৃথক করে।

এটি গাড়ি চালানোর সময় এর মতো, যখন আপনি কেবল তিনটি অধিকার বজায় রাখতে পারেন তখন কেন বাম দিকে ঘোরান? অবশ্যই আপনি পারেন, এবং এটি নিখুঁতভাবে কাজ করে। তবে আপনি যদি বাম বাঁকের শক্তি বোঝেন তবে তিনটি অধিকার বোকামি বলে মনে হচ্ছে।

এটি একটি ফাইল হ্যান্ডেল, 17k র‌্যাম এবং সিপিইউ এর 0.004 সেকেন্ড সময় সঞ্চয় করার বিষয়ে নয়। এটি ইউনিক্স ব্যবহারের সম্পূর্ণ দর্শন সম্পর্কে। আমার দৃষ্টান্তের "বাম বাঁকের শক্তি" কেবল ইনপুটকে পুনর্নির্দেশ করে না, এটি ইউনিক্স দর্শন। এটিকে পুরোপুরি খাঁজ দেওয়া আপনার আশেপাশের তুলনায় অনেক ভাল হয়ে উঠবে এবং যারা বোঝে তাদের কাছ থেকে আপনি শ্রদ্ধা অর্জন করবেন।


2
আপনি যদি কোনও ট্র্যাফিক লাইট ছাড়াই 6-লেনের ব্যস্ত মহাসড়কে বাম দিকে ঘুরানোর কথা ভাবছেন, তবে ডান দিকে ঘুরতে বা অন্য কোনও রুট নিয়ে যাওয়া আপনার বিবেচ্য হতে পারে। * নিক্স আপনাকে কয়েকটি রুটের পছন্দ দেয়। এটি ব্যক্তিগত পছন্দ এবং পাঠযোগ্যতার বিষয়। আপনি যদি "বিড়াল ফাইল | সেমিডি 1 | বিড়াল | সেমিডি 2 | আরও" করতে চান তবে এগিয়ে যান। (কখনও কখনও এটি দরকারী যদি সেমিডি 1 প্যাগিনেট করে - বিড়াল এটিকে নির্মূল করবে)) $ সিপিইউ সময় << $ মস্তিষ্কের সময়।
মাইকপ

1
@ মাইকেপ দ্য প্যাজিনেশনটি কোনওরকম অপসারণ catকরবে না, যদিও কোনও কিছুতে পাইপ দেওয়া কিছু অ্যাপ্লিকেশনগুলির মাধ্যমে পেজিংকে বাদ দিতে পারে।
ট্রিপলি

14

আমি প্রায়শই cat file | myprogramউদাহরণগুলিতে ব্যবহার করি । কখনও কখনও আমার বিরুদ্ধে বিড়ালের অকেজো ব্যবহারের অভিযোগ আনা হচ্ছে ( http://www.iki.fi/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

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

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

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

এটি জোর দেয় যে প্রোগ্রামটি ব্যর্থ হয় না, যদি 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>'

আমি http://oletange.blogspot.dk/2013/10/useless-use-of-cat.html এ পারফরম্যান্স পেনাল্টির দিকে নজর রেখেছি cat file |যদি প্রক্রিয়াজাতকরণের জটিলতা কোনও সাধারণ গ্রেপের সাথে সমান হয় তবে উপসংহারটি ব্যবহার করা হবে না এবং কর্মক্ষমতা পাঠযোগ্যতার চেয়ে বেশি গুরুত্বপূর্ণ। অন্যান্য পরিস্থিতিতে cat file |ঠিক আছে।


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

12

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

দক্ষতা যতদূর যায়, আপনি যদি কমান্ড লাইন থেকে পাইপলাইন চালাচ্ছেন তবে মেশিনটি cat somefile |ব্যবহারের চেয়ে বেশি দক্ষ হবে কিনা তা ভেবে ভাবতে আপনার তুলনায় কম সময় লাগে < somefile। এটা ঠিক কোন ব্যাপার না।


6
কিছুক্ষণের জন্য আমি জানি যে cat somefile | progবিড়াল ছাড়া শেলটি প্রকাশের অন্যান্য উপায় ছিল , যেমন prog < somefileতবে তারা সবসময় আমার কাছে ভুল ক্রমে বলে মনে হয়েছিল, বিশেষত একসাথে পাইপযুক্ত কমান্ডগুলির সাথে। এখন আমি দেখতে পাচ্ছি যে < somefile progকৌতুকটি হিসাবে মার্জিত কিছু , ধন্যবাদ। আমি বিড়ালটি ব্যবহার করতে যে অজুহাত দেখিয়েছি তা শেষ হয়ে গেছে।
অ্যালেক্স

4

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


1
এই উত্তর এবং প্রশ্নের ক্রস-সাইট সদৃশ হিসাবে আলোচিত হিসাবে, grep pattern f1 f2 f3সহজ মনস্তাত্তকরণ নয়grepফাইলগুলি এবং ফাইলের নামগুলি মুদ্রণ করে (এবং allyচ্ছিকভাবে লাইন নম্বরগুলি এবং অন্য কিছু) মুদ্রণ করে। grep . /sys/kernel/mm/transparent_hugepage/*ফাইলের নাম মুদ্রণের জন্য একটি দুর্দান্ত হ্যাক: প্রচুর একক-লাইন ফাইল সহ ফাইল-সামগ্রী। ক্লাসিক ইউনিক্স ডিজাইনটি হ'ল বেশিরভাগ ইউটিলিটিগুলি *.txtপ্রয়োজন ছাড়াই কাজ করে catcatএকাধিক ফাইলকে এক স্ট্রিমে সমতল করার জন্য।
পিটার কর্ডস

@ পিটারকর্ডস আমি গ্রেপ সম্পর্কে এতটা লিখিনি। ত্রুটিগুলি / অনুলিপি-প্রতিরোধের দৃust়তার বিষয়ে আমি পর্যবেক্ষণ করেছি; পারফরম্যান্স বনাম পারফরম্যান্স, যে আপনি কিছু ক্ষুদ্রতম / পেরিফেরিয়াল উদ্বেগের পক্ষে সুবিধাজনকভাবে উপেক্ষা করা বেছে নিয়েছেন।
এলোমেলো স্ট্রিং

আপনি কিছু আকর্ষণীয় এবং বৈধ পয়েন্টগুলি তৈরি করেন, বিশেষত অনুলিপি / পেস্ট পাইপলাইনের সময় আপনি পেতে পারেন এমন ত্রুটিগুলি সম্পর্কে। আমি আপনার grepউদাহরণটি এমন একটি প্রোগ্রামের সাথে প্রতিস্থাপন করার পরামর্শ দিচ্ছি cutযার একাধিক ফাইলের যত্ন নেওয়ার কোনও কারণ নেই এবং সর্বদা এটির স্টিডিন থেকে খাওয়ানো যেতে পারে। কিছু ইউটিলিটি, মত tr, সব এ ফাইল args, এবং শুধুমাত্র একটি ফিল্টার হিসেবে কাজ গ্রহণ করা হয় না, তাই পছন্দ মধ্যে catএবং <
পিটার কর্ডেস

1
আপনার পোস্টের সাথে আমার সবচেয়ে বড় সমস্যা হ'ল আপনি ইনপুট পুনঃনির্দেশকে ছাড় পান। <file cmd1 | cmd2 >outআমি স্বীকার করি না, তবে এটির অভ্যস্ত হওয়া সম্পূর্ণ সম্ভব। আপনি "সর্বশক্তিমান ইউনিক্সের চেতনা" সম্পর্কে একটি বিদ্রূপাত্মক উপায়ে চলতে থাকুন, যা আমার পক্ষে পুরোপুরি সমতল হয়ে যায় কারণ ইউনিক্স ডিজাইনাররা যেভাবে ভাবেন সেভাবে আপনি পাচ্ছেন না বা পেতে চান না বলে মনে হচ্ছে। আপনি যদি ইউনিক্স ডিজাইনটি পছন্দ না করেন তবে এটি ঠিক আছে, তবে এটি সহজাত বোবা নয়। আমি নিশ্চিত নই যে ওএসের নকশাটি শেল সিনট্যাক্সের পূর্বাভাস দেয়, এবং কীভাবে এটি সমস্ত বিকশিত হয়েছিল, তবে cat1970 সালে একটি অতিরিক্ত এড়ানো মূল্যহীন ছিল!
পিটার কর্ডেস

1
@ পিটারকর্ডস হিটেডসাইটে আমি আমার উত্তরকে দীর্ঘস্থায়ী করেছিলাম, যা সবচেয়ে গুরুত্বপূর্ণ বিষয়টিকে সরিয়ে দেয় - যথার্থতা প্রথম, অপ্টিমাইজেশন দ্বিতীয়। অতিরিক্ত catপুনরায় ব্যবহার এবং পাইপলাইনগুলি বিচ্ছিন্ন করতে সহায়তা করে, তবে এটি ছাড়া আপনি নীরব ব্যর্থতা পেতে পারেন (আমার উত্তরে "নীরবে" অনুসন্ধান করুন)।
এলোমেলো স্ট্রিং

2

বিড়ালের অপ্রয়োজনীয় ব্যবহারের প্রতিরক্ষায়

(এই অনুশীলনের বিরুদ্ধে উত্তেজনাপূর্ণ মন্তব্যে সুনামির ভারসাম্য রক্ষার জন্য কয়েকটি অনুচ্ছেদ)

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

এটি ইতিমধ্যে সুস্পষ্ট যে প্রশ্নকার লেখকের মতো আমি অনুভব করি যে বাশের মতো একটি রিপ্লেয়ারে কাজ করার সময় বিড়াল ব্যবহার করা খুব স্বাভাবিক, যেখানে আমি ক্রমবর্ধমান জটিল কমান্ডগুলি নির্মাণ করে একটি সমস্যা অন্বেষণ করছি। এখানে একটি খুব সাধারণ উদাহরণ: আমার কাছে একটি পাঠ্য ফাইল রয়েছে এবং এটি সম্পর্কে খুব বেশি কিছু জানেন না। আমি cat fileবিষয়বস্তুর স্বাদ পেতে টাইপ করব । তাহলে আউটপুট খুব বেশী হয় আমি তীর আমার আপ আঘাত করব এবং পরিস্থিতির উপর নির্ভর করে আমি যোগ করব | headবা | grep fooবা | what_everপ্রক্রিয়াকরণের পদক্ষেপ সংযোজন করে আমার আগের কমান্ড ব্যাপ্ত। অন্যের পরে একটি প্রসেসিং স্টেপ যুক্ত করে ক্রমানুসারে সাধারণ কমান্ড থেকে আরও জটিল একের দিকে যাওয়ার এই উপায়টি আমার কাছে খুব স্বাভাবিক মনে হয় (আমি আইপিথনেও একই কাজ করছি এবং আমি উপায়টি পছন্দ করি)pyfunctionalএবং অনুরূপ প্রোগ্রামিং সরঞ্জামগুলি এই স্টাইলটি অন্তর্ভুক্ত করে)। সুতরাং যখন ব্যাশ শেল কাজ আমি আমার প্রবাহ বিঘ্নিত মুছে ফেলার জন্য যে আত্মবিশ্বাসী আছি catহয় আরো বেহুদা তুলনায় এটি হতে হবে এবং মামলার 99.9% কষ্ট ... এ সব ভাল কোন ফল যাক।

অবশ্যই স্ক্রিপ্ট লেখার সময় জিনিসগুলি পরিবর্তন হতে পারে । এমনকি স্ক্রিপ্টগুলি লেখার সময়ও আমার মতে যে লোকেরা ইউ ইউ সি-কে উপহাস করে তারা দুর্দান্ত মন দিয়ে এই গুরুত্বপূর্ণ পাঠটিকে অগ্রাহ্য করে: "অকালীন অপটিমাইজেশন হ'ল সমস্ত মন্দের মূল" । এবং আপনি যদি অ্যাটিক্যাল কিছু না করে থাকেন তবে ইউইউসির এমন জায়গা হওয়া সত্যিই শক্ত যেখানে অপটিমাইজেশন প্রয়োজন হবে। অবশ্যই আপনাকে অবশ্যই এটি সম্পর্কে অদক্ষ কী তা জানতে হবে (এটি অতিরিক্ত প্রক্রিয়া অনুরোধ বিটিডাব্লু যেহেতু খুব কম লোকই উল্লেখ করেছে বলে মনে হয়)। সেই জ্ঞান থাকা যদি আপনি সেই বিরল সিস্টেমে কাজ করতে যান যেখানে কোনও প্রক্রিয়া শুরু করা ব্যয়বহুল (যেমন কিছু এম্বেডেড সিস্টেম বা সাইগউইন আরও কিছুটা কম) আপনি যদি জানতে পারেন যে কোনও বিশেষ পরিস্থিতির প্রয়োজনে কী করতে হবে what উদাহরণস্বরূপ যদি আপনি নিজেকে কল করে দেখতে পানcatএকটি লুপে সেকেন্ডে অনেকবার (যদি আপনি সেই অবস্থানে নিজেকে খুঁজে পান তবে বিটিডাব্লু নিজেকে জিজ্ঞাসা করুন যে চাকরি কাজের উপযুক্ত সরঞ্জাম কিনা)। আবার যদিও: "প্রথমে এটি সঠিকভাবে কাজ করুন এবং তারপরে প্রয়োজনে এটি অপ্টিমাইজ করুন"

এবং আপনি ইউইউসি নিক সম্পর্কে অভিযোগের সুনামি কীভাবে ব্যাখ্যা করবেন?

সবাই আমার স্বাদ না পেয়েও আমি বিশ্বাস করি যে ইউইওসি-র বিষয়ে এত লোক অভিযোগ করার একটি প্রধান অংশ প্রযুক্তিগত নয় তবে মানবিক: বেশিরভাগ ইউনিক্স-নতুনরা এই < file commandআইডিয়ামটি সম্পর্কে জানতে পারবেন না তাই এটি আরও অভিজ্ঞ ব্যক্তিকে "ওল্ড গুরু" বাজানোর জন্য প্ররোচিত করে " তাদের কাছে। তিনি অভিনব শব্দ ("প্রক্রিয়া প্রার্থনা") ব্যবহার এবং "অনুকূলিতকরণ" প্রিয় বিষয় স্পর্শ করার সুযোগ পাবেন। একটি ভাল ছাপ গ্যারান্টিযুক্ত তাই এটি প্রতিরোধ করা খুব কঠিন। তারপরে নতুনরা গুরুর পরামর্শকে গুরুত্বের সাথে বিবেচনা করবে এবং দীর্ঘ সময় ধরে এটি অন্যদের কাছে "একমাত্র সত্য" হিসাবে পুনরায় খেলবে (এবং এই উত্তরটি: -) ডাউন করে দেবে। মজার নোট: ইউ ইউওসি-র কোনও অদক্ষতা এড়াতে বাশ ফিক্স করা সম্ভবত এতটাই সহজ যে কেউ কেন এই বৈশিষ্ট্যটি যুক্ত করেন নি বা তৈরি করেছে তা ভাবতে হবে has< filenameবিড়াল এত বছর পরে একটি ফাইল। একটি অন্ধকার আত্মা পরামর্শ দেয় যে কিছু ধূসর রঙের ব্যাশ হ্যাকাররা আমাদের উপহাস করার সুযোগগুলি ছেড়ে দিতে পছন্দ করে ;-)


+1 নৃতাত্ত্বিক কারণগুলি যে এই অনুশীলনটি প্রচার করে তা সম্পর্কে সর্বশেষ অনুচ্ছেদে প্রেম করুন :-)
এলোমেলো স্ট্রিং

1

সত্যিই খুব সুন্দর হবে এমন একটি শেল যা সিনট্যাক্সকে সমর্থন করে:

< filename cmd | cmd2 cmd2arg1... | cmd3

ইতিমধ্যে আমি মনে করি cat filename | realcmd1...গ্রহণযোগ্য, কারণ এটি প্রাথমিক কমান্ডগুলির সাথে সিনট্যাক্সকে স্ট্যান্ডার্ড করে রাখে যার পক্ষে আর্গুমেন্ট হিসাবে ফাইলের নাম প্রয়োজন।


17
বাশ এবং অনুরূপ শেল সমর্থন করে < filename cmd | cmd2 ...। এটা কি যথেষ্ট?
গ্যারিজন

@ গ্যারিজাহান: আমি মনে করি আপনার উত্তরটি পোস্ট করা উচিত।
কেভিন রেড

14
বাধ্যতামূলক পুরানো শেল-হ্যাকার মন্তব্য: বোর্ন-স্টাইলের শেলগুলি < file command ...কমপক্ষে 80-এর দশকের মাঝামাঝি থেকে এবং সম্ভবত মূল shলেখাটি যখন 70 এর দশকের মতো ফিরে এসেছে তখন সমর্থন করেছে supported আরও সাধারণভাবে, i / o পুনঃনির্দেশগুলি বাম থেকে ডানে পার্স করা হয় এবং কমান্ড লাইনের মধ্যে যে কোনও ক্রমকে ছেদ করা যায়। সুতরাং, cmd <file arg arg...এছাড়াও বৈধ হবে।
ডেল হ্যাগলুন্ড

3
হ্যাঁ, এটি আংশিক কারণ টাইপ করা কত সহজ যে আমি ইউইউসি আবিষ্কার করেছি।
রান্ডাল শোয়ার্জ

2
একটি স্থানান্তরিত চরিত্র বনাম চারটি আনশিফ্ট এত বড় তাত্পর্য নয়, এবং আমি বরং একটি অতিরিক্ত প্রক্রিয়া করতাম, যা আমার ফোনটি সবেমাত্র লক্ষ্য করে, আমার প্রম্পটে একটি ফাইল পাইপ করার চেয়ে, যা আমি যখনই দেখি তখনই মাথা ব্যথা করে gives ।
অ্যারন মিলার

0

যারা বিড়াল ব্যবহার করেন তা গ্রহণযোগ্য বলে সবার জন্য কারণ এটি "গন্ধ" আরও ভাল বা "আরও পাঠযোগ্য" "আমি কেবল এটিই বলব:

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

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

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

ঘরের ব্যবহারকারী হিসাবে আপনি আমার পরামর্শ থেকে শিখতে পারেন এবং জিনিসগুলি করার আরও ভাল উপায়গুলি শিখতে পারেন বা বিড়ালের "গন্ধ" দ্বারা অন্ধ হয়ে যাওয়া বেছে নিতে পারেন, আপনার পছন্দ ... তবে জেনে রাখুন যে আপনি যদি প্রকাশ্যে এই অভ্যাসটি ব্যবহার করেন তবে আপনাকে ডাকা হবে এই অনুশীলনের উপর সর্বদা এবং আপনাকে নিঃশব্দে স্বীকার করতে হবে যে তারা সঠিক এবং আপনি জেদী কারণ এটি সত্য। :-)


আমি দীর্ঘমেয়াদী লিনাক্স (এবং পূর্ববর্তী * নিক্স) ব্যবহারকারী এবং সফ্টওয়্যার বিকাশকারীও। আপনি দেখার জন্য "এটি আমাদের চোখের রক্ত ​​ঝরেছে" বললে আপনি আমার পক্ষে কথা বলেন না cat foo.txt | ...। অন্য উত্তরগুলি কেন এটি ভাল ব্যবহার হতে পারে তা ভালভাবে ব্যাখ্যা করে। পক্ষে মামলার সরল সংক্ষিপ্তসার হ'ল: "$ সিপিইউ সময় << $ মস্তিষ্কের সময়" (@ মাইকপ উপরে মন্তব্য করেছেন)।
জিম ডিএলাহান্ট

প্রথমত, এটি ২০১৩ সাল থেকে একটি উত্তর ছিল (মৃত লোকেদের পুনরুদ্ধারের উপায়)। দ্বিতীয়ত, নোট করুন যে প্রশাসক বা বিকাশকারী হিসাবে আমাদের সর্বদা সম্ভব যেখানে সম্ভব সম্পদ ব্যবহার হ্রাস করার জন্য প্রচেষ্টা করা উচিত। অ্যাপ্লিকেশন এবং পরিষেবাগুলি লেখার সময় আপনি মেমরি বা সিপিইউ ড্রেনগুলির জন্য দেখার চেষ্টা করেন যা অ্যাপ / পরিষেবাটিতে খুব কম বা কোনও লাভ দেয় না? ওয়েল UUOC ঠিক যে। এখন, বিড়ালের পুরোপুরি বৈধ ব্যবহার রয়েছে আমি নিশ্চিত যে কমান্ডে পাইপিং করা জড়িত ... কেবল প্রায়শই নয়। সুতরাং আপনি যেমনটি বলছেন তেমন আমি আপনার পক্ষে কথা বলতে পারি না ... তবে আপনি যদি পেশাদার হন তবে আমি অবাক হব কেন আপনি আরও সহজেই রাজি হন না (সত্যিকারের ইউইউসি পরিস্থিতি দেওয়া হয়েছে)।
ডেভিড ড্রেগার্স

সমস্যাটি হ'ল কোনও বিকাশকারীকে অনুকূলকরণের জন্য মেমরি বা সিপিইউ ড্রেনগুলি কেবলমাত্র ব্যয় নয়। মানুষের সময় ব্যয়, সমস্যাটি বোঝার জন্য এবং একটি বাস্তবায়ন লিখতে এবং ডিবাগ করাও এই ব্যবসায়ের অংশ। এখানে কয়েকটি উত্তর একটি রায়ের উপর ভিত্তি করে তৈরি করা হয়েছে যে মানব সময়টি স্মৃতি বা সিপিইউর চেয়ে বেশি দুর্লভ এবং ব্যয়বহুল। । … তবে এটি আলোচনায় পরিণত হচ্ছে, যা নিয়মের বিপরীতে। উত্তরের ভোটগুলি এমন কথা বলতে দিন যার জন্য সুপার ব্যবহারকারীরা সমর্থন করেছেন।
জিম DeLaHunt
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.