আমার কি অপ্রয়োজনীয় বিড়ালদের যত্ন নেওয়া উচিত?


50

কমান্ড-লাইনের অনেকগুলি ইউটিলিটিগুলি পাইপ থেকে বা ফাইলের নাম যুক্তি হিসাবে তাদের ইনপুট নিতে পারে। দীর্ঘ শেল স্ক্রিপ্টগুলির জন্য, আমি শৃঙ্খলাটি শুরু করে catএটি আরও পঠনযোগ্য করে তোলে বিশেষত যদি প্রথম কমান্ডটিতে মাল্টি-লাইন আর্গুমেন্টের প্রয়োজন হয়।

তুলনা করা

sed s/bla/blaha/ data \
| grep blah \
| grep -n babla

এবং

cat data \
| sed s/bla/blaha/ \
| grep blah \
| grep -n babla

পরবর্তী পদ্ধতিটি কি কম দক্ষ? যদি তাই হয়, স্ক্রিপ্টটি চালিত হয় কিনা তা যত্ন নেওয়ার পক্ষে যথেষ্ট পার্থক্য কি, একবার বলুন? পাঠযোগ্যতার পার্থক্য বিশাল নয় not


30
আমার সিস্টেমে আসলে বিড়াল প্রক্রিয়াগুলি শুরু করার চেয়ে লোকেরা এই সাইটে অকেজো বিড়াল ব্যবহার সম্পর্কে একে অপরকে আক্রমণ করে দেখার জন্য আরও বেশি সময় ব্যয় করে
মাইকেল মরোজেক

4
@ মিশেল: 100% সম্মত হিক আমার কম্পিউটারটি তাত্ক্ষণিকভাবে অপচয় করবে না তার চেয়ে একবারে পুরানো ইউজনেট পুরষ্কারের সাথে লিঙ্ক করতে আমাকে আরও সময় লাগল cat। তবে আমি মনে করি এখানে বড় প্রশ্ন হলো কোড পাঠযোগ্যতা যা প্রায়ই হয় কর্মক্ষমতা উপর একটি অগ্রাধিকার। যখন দ্রুত আসলে লেখা যেতে পারে , prettier , কেন নয়? ইস্যুটি ইস্যু করার সাথে catসাধারণত ব্যবহারকারী সাধারণত পাইপলাইন এবং প্রক্রিয়াগুলি সম্পর্কে আরও ভাল বোঝার দিকে নিয়ে যায়। এটি প্রচেষ্টাটির পক্ষে মূল্যবান যাতে তারা পরের বারের মতো বোধগম্য কোডটি লেখেন।
কালেব

3
আমার আর একটি কারণ আছে যা আমি প্রথম ফর্মটি পছন্দ করি না - আপনি যদি পাইপলাইনের শুরুতে অন্য কমান্ড যুক্ত করতে চান তবে আপনাকে যুক্তিটিও সরিয়ে নিতে হবে, তাই সম্পাদনাটি আরও বিরক্তিকর। (অবশ্যই, এর অর্থ এটি নয় যে আপনাকে ব্যবহার করতে হবে cat; ফাংশন এবং পুনঃনির্দেশগুলি ব্যবহার সম্পর্কে কালেবের বক্তব্যও এটি সমাধান করে))
ক্যাসাবেল


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

উত্তর:


46

"চূড়ান্ত" উত্তর অবশ্যই অ্যাওয়ার্ড ইউজ অফ catঅ্যাওয়ার্ড দ্বারা আপনার কাছে নিয়ে এসেছিল ।

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

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

বেশিরভাগ প্রোগ্রাম, যেমন আপনি লক্ষ্য করেছেন, ইনপুট ফাইলের জন্য একটি আর্গুমেন্ট গ্রহণ করতে সক্ষম। তবে, সবসময় শেল <বিল্টিন থাকে যা STDIN প্রবাহটি প্রত্যাশিত যেখানেই ব্যবহার করা যেতে পারে যা ইতিমধ্যে চালু শেল প্রক্রিয়াতে কাজ করে আপনাকে একটি প্রক্রিয়া সংরক্ষণ করবে।

আপনি যেখানে লেখেন সেখানে সৃজনশীলও পেতে পারেন। সাধারণত কোনও আউটপুট পুনঃনির্দেশ বা পাইপগুলি নির্দিষ্ট করার আগে এটি একটি কমান্ডের শেষে স্থাপন করা হবে:

sed s/blah/blaha/ < data | pipe

তবে এটি সেভাবে হতে হবে না। এটি এমনকি প্রথম আসতে পারে। উদাহরণস্বরূপ আপনার উদাহরণ কোডটি এভাবে লেখা যেতে পারে:

< data \
    sed s/bla/blaha/ |
    grep blah |
    grep -n babla

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

function fix_blahs () {
    sed s/bla/blaha/ |
    grep blah |
    grep -n babla
}

fix_blahs < data

আপনি তারপর চালিয়ে যেতে পারে fix_blahs < data | fix_frogs | reorder | format_for_sql। এর মতো পড়া একটি পাইপলাইন অনুসরণ করা সত্যই সহজ এবং পৃথক উপাদানগুলি তাদের নিজ নিজ কার্যক্রমে সহজেই ডিবাগ করা যায়।


26
আমি জানতাম না যে <fileকমান্ডের আগে আসতে পারে। এটি আমার সমস্ত সমস্যার সমাধান করে!

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

8
@Tim <fileকমান্ড লাইন কোথাও আসতে পারে: <file grep needleবা grep <file needleবা grep needle <file। ব্যতিক্রম জটিল কমান্ড যেমন লুপ এবং গ্রুপিং; পুনঃনির্দেশটি অবশ্যই বন্ধ done/ }/ )/ ইত্যাদি পরে আসবে । @ কালেব এটি সমস্ত বোর্নে / পসিক্স শেল ধারণ করে। এবং আমি একমত যে এটি কুরুচিপূর্ণ।
গিলস

9
@Gilles, ব্যাশ আপনি প্রতিস্থাপন করতে পারেন $(cat /some/file)সঙ্গে $(< /some/file), যা একই জিনিস আছে কিন্তু একটি প্রক্রিয়া ডিম ছাড়ার এড়াতে।
সিজেএম

3
কেবল তা নিশ্চিত করার জন্য এটি $(< /some/file)সীমিত বহনযোগ্যতার। এটি ব্যাশে কাজ করে তবে ব্যাসিবক্স অ্যাশ নয়, উদাহরণস্বরূপ, বা ফ্রিবিএসডি এসএইচ। সম্ভবত ড্যাশগুলিতে কোনও কাজ করে না, যেহেতু শেষ তিনটি শেল সমস্ত কাছের চাচাতো ভাই।
সন্দেহভাজন

22

এর কিছু ত্রুটিগুলির সংক্ষিপ্তসার এখানে দেওয়া হল:

cat $file | cmd

উপর

< $file cmd
  • প্রথমত, একটি নোট: উপরে (প্রায়শই আলোচনার উদ্দেশ্য নিয়ে) মিস করা আছে ডাবল উক্তিগুলি প্রায় $fileউপরে। ক্ষেত্রে catসর্বদা এটি ছাড়া সবসময়ই একটি সমস্যা zsh; পুনঃনির্দেশের ক্ষেত্রে, এটি কেবলমাত্র ইন্টারেক্টিভ (স্ক্রিপ্টগুলিতে নয়) কেবল তখনই অন্য কোনও শেলের জন্য bashবা এর জন্য ksh88এবং কেবলমাত্র একটি সমস্যা ।
  • সর্বাধিক প্রায়শই উদ্ধৃত ত্রুটিটি হ'ল অতিরিক্ত প্রক্রিয়া তৈরি হয়। মনে রাখবেন যে যদি cmdঅন্তর্নির্মিত হয় তবে এটি কিছু শেলের মতো 2 টি প্রক্রিয়াও bash
  • এখনও পারফরম্যান্সের সম্মুখভাগে, যেখানে catঅন্তর্নির্মিত শেলগুলি ব্যতীত , সেগুলিও একটি অতিরিক্ত কমান্ড কার্যকর করা হবে (এবং অবশ্যই বোঝা, এবং আরম্ভ করা (এবং এটির সাথে যুক্ত গ্রন্থাগারগুলি))।
  • কর্মক্ষমতা সামনে এখনও, বড় ফাইল জন্য, তার মানে সিস্টেম পর্যায়ক্রমে নির্দিষ্ট সময় নির্ধারণের জন্য থাকবে catএবং cmdপ্রক্রিয়া এবং ক্রমাগত ভরাট এবং পাইপ বাফার খালি। এমনকি যদি cmdনা 1GBবৃহৎ read()সিস্টেম একটি সময়ে কল নিয়ন্ত্রণ মধ্যে আগে পিছে যেতে হবে catএবং cmdকারণ একটি নল একটি সময়ে তথ্য একটি কয়েক কিলোবাইট চেয়ে বেশি রাখা যাবে না।
  • কিছু কিছু cmd(যেমন wc -c) কিছু অপ্টিমাইজেশন করতে পারে যখন তাদের স্টিডিন একটি নিয়মিত ফাইল হয় যা তারা করতে পারে না কারণ তাদের স্টাডিন তখন cat | cmdকেবল পাইপ pipe সঙ্গে catএবং একটি নল, এটি এর মানে হল তারা পারে না seek()ফাইল মধ্যে। tacবা এর মতো কমান্ডের জন্য tail, এটি পারফরম্যান্সে একটি বিশাল পার্থক্য তৈরি করে যার অর্থ catতাদের সাথে পুরো ইনপুট মেমরির মধ্যে সঞ্চয় করা দরকার।
  • cat $file, এবং এমনকি তার আরো সঠিক সংস্করণ cat -- "$file"মত কিছু নির্দিষ্ট ফাইল নামের জন্য ঠিকমত কাজ করবে না -(বা --helpবা দিয়ে শুরু কিছু -যদি তোমাকে ভুলে --)। যদি কেউ ব্যবহারে জোর দেয় তবে catতার cat < "$file" | cmdপরিবর্তে সম্ভবত নির্ভরযোগ্যতার জন্য ব্যবহার করা উচিত ।
  • যদি $fileপড়ার জন্য উন্মুক্ত না হতে পারে (অ্যাক্সেস অস্বীকৃত, অস্তিত্ব নেই ...), < "$file" cmdএকটি সামঞ্জস্যপূর্ণ ত্রুটি বার্তা (শেল দ্বারা) প্রতিবেদন করবে এবং চালাবে নাcmd , cat $file | cmdতখনও চলবে cmdতবে এর স্টিডিনটি খালি ফাইলের মতো দেখায়। যে এর মানে হল যে ভালো জিনিস < file cmd > file2, file2clobbered না হয় fileখোলা যাবে না।

2
পারফরম্যান্স সম্পর্কে: এই পরীক্ষাটি দেখায় যে পার্থক্যটি 1 পিসিটির
ওলে

2
@OleTange। এখানে আরেকটি পরীক্ষা আছে: truncate -s10G a; time wc -c < a; time cat a | wc -c; time cat a | cat | wc -c। অনেকগুলি পরামিতি রয়েছে যা ছবিতে আসে। পারফরম্যান্স পেনাল্টি 0 থেকে 100% পর্যন্ত যেতে পারে। যাই হোক না কেন, আমি মনে করি না যে শাস্তি নেতিবাচক হতে পারে।
স্টাফেন চেজেলাস

2
wc -cএটি একটি দুর্দান্ত অনন্য কেস, কারণ এটির একটি শর্টকাট রয়েছে। আপনি যদি এর পরিবর্তে এটি করেন wc -wতবে এটি grepআমার উদাহরণের সাথে তুলনাযোগ্য (অর্থাত্ খুব অল্প প্রক্রিয়াজাতকরণ - যা এমন পরিস্থিতিতে যেখানে '<' পার্থক্য আনতে পারে )।
ওলে টাঞ্জ

@ ওলেট্যাঞ্জ, এমনকি ( wc -wলিনাক্স ৪.৯ এএমডি .৪ তে সি লোকালে 1 জিবি স্পার্স ফাইলের ক্ষেত্রে) তবে আমি দেখতে পাচ্ছি যে মাল্টিকোর সিস্টেমে বিড়ালটির পদ্ধতির জন্য 23% বেশি সময় লাগে এবং যখন তাদের একটি কোরকে আবদ্ধ করে রাখে 5%। আরও একটি কোর দ্বারা ডেটা অ্যাক্সেস করে অতিরিক্ত অতিরিক্ত ওভারহেড দেখানো হচ্ছে। আপনি যদি পাইপের আকার পরিবর্তন করেন, বিভিন্ন ডেটা ব্যবহার করেন, রিয়েল আই / ও বিভক্ত বিড়াল প্রয়োগ ব্যবহার করেন যা স্প্লাইস () ব্যবহার করে ... সম্ভবত ছবিতে অনেকগুলি প্যারামিটার পাওয়া যাচ্ছে তা নিশ্চিত করে আপনি পৃথক ফলাফল পাবেন'll এবং যে কোনও ক্ষেত্রে catসাহায্য করবে না।
স্টাফেন চেজেলাস

1
আমার কাছে 1 জিবি ফাইলের সাথে wc -wএটি প্রায় 2% ... 15% পার্থক্য যদি এটি একটি সরল সরল গ্রেপের মধ্যে থাকে। তারপরে, অদ্ভুতভাবে, যদি এটি কোনও এনএফএস ফাইল শেয়ার হয় তবে এটি পড়তে আসলে 20% দ্রুত হয় cat( gist.github.com/rdp/7162414833becbee5919cda855f1cb86 ) থেকে পাইপ করা থাকলে অদ্ভুত ...
রোজারডপ্যাক

16

ফেলে <fileএকটি পাইপলাইন শেষে থাকার চেয়ে কম পাঠযোগ্য cat fileশুরুতে। প্রাকৃতিক ইংরেজি বাম থেকে ডানে পড়ে reads

ফেলে <fileএকটি পাইপলাইন শুরুর এছাড়াও বিড়াল কম পাঠযোগ্য, আমি বলতে হবে। একটি শব্দ একটি চিহ্নের চেয়ে বেশি পঠনযোগ্য, বিশেষত একটি প্রতীক যা ভুল উপায়ে দেখায়।

ব্যবহার catকরে command | command | commandফর্ম্যাট সংরক্ষণ করে ।


আমি একমত, <একবার ব্যবহার করা কোডকে কম পঠনযোগ্য করে তোলে, কারণ এটি একটি মাল্টিপলাইনের সিনট্যাক্সের ধারাবাহিকতা নষ্ট করে।
ড্যানিশচেউস্কি

@ জিম আপনি এটি পছন্দ করতে একটি উপন্যাস তৈরি করে পাঠযোগ্যতার সমাধান করতে <পারেন: alias load='<'এবং তারপরে উদাহরণ ব্যবহার করুন load file | sed ...। চালানোর পরে স্ক্রিপ্টগুলিতে এলিয়াস ব্যবহার করা যায় shopt -s expand_aliases
Niiani

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

8

এখানে অন্য উত্তরগুলি সরাসরি সম্বোধন করেছে বলে মনে হয় না তা হ'ল এইরকম ব্যবহার করা cat"বেহুদা" নয় এই অর্থে যে "বহিরাগত বিড়াল প্রক্রিয়া তৈরি হয় যা কোনও কাজ করে না"; এটি এই অর্থে অকেজো যে "একটি বিড়াল প্রক্রিয়া তৈরি হয়েছে যা কেবলমাত্র অযথা কাজ করে"।

এই দু'জনের ক্ষেত্রে:

sed 's/foo/bar/' somefile
<somefile sed 's/foo/bar/'

শেলটি একটি সেড প্রক্রিয়া শুরু করে যা সামুফাইল বা স্টিডিন (যথাক্রমে) থেকে পড়ে এবং পরে কিছু প্রক্রিয়াজাতকরণ করে - এটি নতুন লাইনে আঘাত না হওয়া অবধি পড়া হয়, সেই লাইনে প্রথম 'ফু' (যদি থাকে) প্রতিস্থাপন করে তবে বারটি stdout এবং লুপস যে লাইন।

এর ব্যাপারে:

cat somefile | sed 's/foo/bar/'

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

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


2
অতিরিক্ত ব্যবহারের ওভারহেডের পরীক্ষা করার জন্য oletange.blogspot.dk/2013/10/useless-use-of-cat.html দেখুন cat
ওলে টেঞ্জ

@ ওলেট্যাঞ্জ: আমি কেবল এটি পেরেছি এবং আপনার ব্লগটি দেখেছি। (1) আমি ইংরেজিতে (বেশিরভাগ ক্ষেত্রে) সামগ্রী দেখতে পেয়েছি, ডেনিশ ভাষায়: "ক্লাসিস্ক", "ফ্লিপকার্ড", "ম্যাগাসিন", "মোসাইক", "সাইডবজলকি", "bজেব্লিকসবিলেড" , "টিডসকিদার", "ব্লগ-আরকিভ", "ওম মাইগ", "স্ক্রাইভেট", এবং "ভিস কমেন্টার" (তবে "টুইট", "লাইক", এবং কুকিজ ব্যানার ইংরাজীতে রয়েছে)। আপনি কি এই সম্পর্কে জানতেন, এবং এটি কি আপনার নিয়ন্ত্রণে আছে? (২) আপনার টেবিলগুলি পড়তে আমার অসুবিধা হচ্ছে (২ ক) কারণ গ্রিডলাইনগুলি অসম্পূর্ণ, এবং (২ বি) "ডিফ (পিটিটি)" দ্বারা আপনি কী বোঝেন তা আমি বুঝতে পারি না।
জি-ম্যান বলেছেন 4 'এ' মনিকাকে পুনরায় ইনস্টল করুন '

ব্লগস্পট.ডিকে গুগল দ্বারা চালিত হয়। ব্লগস্পট.কমের সাথে প্রতিস্থাপনের চেষ্টা করুন। "ডিফ (পিটিটি)" হ'ল এমএসে ভাগ ভাগ catছাড়াই এমএস দ্বারা বিভক্ত cat(উদাহরণস্বরূপ 264 এমএস / 216 এমএস = 1.22 = 122% = 22% ধীর cat)
ওলে টেঞ্জ
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.