স্টিডিন এবং কমান্ড লাইন আর্গুমেন্টের মধ্যে পারফরম্যান্স পার্থক্য


11

কিছু কমান্ডের জন্য, স্ট্যান্ডিন বা কমান্ড লাইন আর্গুমেন্ট হিসাবে নির্দিষ্ট ইনপুট নির্দিষ্ট করা সম্ভব।

বিশেষ করে, আমি অনুমান commandstdin ইনপুট এবং কমান্ড লাইন আর্গুমেন্ট হিসাবে একটি ফাইল নিতে পারেন, এবং command < myfile, cat myfile | command এবং command myfileএকই ফলাফল তৈরী করতে পারে।

উদাহরণ স্বরূপ,

কমান্ডটি যখন sed:

sed s/day/night/ <myfile >new   
sed s/day/night/ myfile >new    
cat myfile | sed s/day/night/ >new

কমান্ডটি যখন cat:

cat < myfile
cat myfile
  1. আমি ভাবছিলাম যে তাদের অভিনয় সম্পর্কে কিছু সাধারণ নিয়ম আছে, যার মধ্যে কোনটি সাধারণত সবচেয়ে দক্ষ এবং কোনটি সর্বনিম্ন?
  2. পুনর্নির্দেশটি কি সর্বদা পাইপের চেয়ে ভাল?

1
আমি আশা করি প্রত্যেকে এই (অনুলিপি করা) প্রশ্ন জিজ্ঞাসা করুন এবং অনুশীলন হিসাবে স্ক্র্যাচ থেকে নিজের শেলটি লিখুন।
অ্যালেক্স

1
দয়া করে "ধন্যবাদ!" ব্যবহার করবেন না আপনার প্রশ্নে আপনার কৃতজ্ঞতা প্রকাশ করতে উত্তরগুলি ভোট দিন।
অ্যালেক্স

@ অ্যালেক্স: এটি যদি কোনও ডুপ হয় তবে দয়া করে সদৃশটির সাথে লিঙ্ক করুন এবং আমরা এটি বন্ধ করার কাজ করব। সাধারণত আপনি এমন একটি প্রশ্নের সদুত্তর থেকে বিরত থাকবেন যা আপনি জানেন যে এটি একটি সদৃশ এবং এটি মডারেটরের মনোযোগের জন্য পতাকাঙ্কিত করুন।
কালেব

1
@ অ্যালেক্স: আমি নিজের শেলটি লিখতে কোথায় শিখতে পারি?
টিম

@ কালেব: আমি নিশ্চিত যে এটিকে গত মাসে 2 বা 3 বার জিজ্ঞাসা করা হয়েছিল, কেবল লিঙ্কটি হাতে নেই :-p
অ্যালেক্স

উত্তর:


6

cat file | commandসিনট্যাক্স একটি বিবেচনা করা হয় এর বেহুদা ব্যবহারেরCat । আপনার সমস্ত বিকল্পগুলির মধ্যে এটি একটি পারফরম্যান্স হিট নেয় কারণ এটি কার্নেলের মধ্যে অন্য একটি প্রক্রিয়া তৈরি করতে হয়। তবে এটি বড় ছবিতে তুচ্ছ হতে পারে, অন্য ফর্মগুলির এটি ওভারহেড নয়। এটি যেমন প্রশ্নের উপরে আচ্ছাদিত করা হয়েছে: আমার অপ্রয়োজনীয় বিড়ালদের যত্ন নেওয়া উচিত?

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

পার্থক্যটি আপনি কী কী বৈশিষ্ট্য / নমনীয়তা সন্ধান করছেন তাতে হবে।

  • প্রোগ্রামটিতে ফাইলের নামটি অর্থাত্ ইনপুট ফাইলটি অনুসন্ধানযোগ্য ছিল। এটি প্রোগ্রামটির পক্ষে বা না-ই লাগতে পারে তবে স্ট্রিমটি সন্ধানযোগ্য হলে কিছু অপারেশন বাড়িয়ে দেওয়া যেতে পারে।
  • আসল ইনপুট ফাইলটি জানার ফলে আপনার প্রোগ্রামটি এতে সম্ভাব্য লেখার অনুমতি দেয় write sed -iইন-প্লেস এডিটিংয়ের জন্য উদাহরণস্বরূপ । (দ্রষ্টব্য: যেহেতু এটি পর্দার আড়ালে একটি নতুন ফাইল তৈরি করতে হবে এটি অন্যান্য পুনর্নির্দেশগুলির চেয়ে পারফরম্যান্স লাভ নয় তবে এটি একটি সুবিধাপূর্ণ পদক্ষেপ))
  • শেল পুনর্নির্দেশগুলি ব্যবহার করা আপনাকে একাধিক ফাইলকে একত্রিত করার বা এমনকি প্রক্রিয়া পুনঃনির্দেশ ব্যবহার করার ক্ষমতা দেয়। sed [exp] < file1 file2বা এমনকি sed [exp] < <(grep command)। এই ব্যবহারের কেসের বিশদটি এই প্রশ্নের উপরে পাওয়া যাবে: প্রক্রিয়া প্রতিস্থাপন এবং পাইপ

প্রক্রিয়া প্রতিস্থাপন আপনাকে ফলাফলটি পাইপ না করে কাজ করা উচিত; sed [exp] < <(grep command)ঠিক তেমন কাজ করবে sed [exp] <(grep command)(যেহেতু <(grep command)কমান্ডের দৈর্ঘ্যের জন্য একটি নামী অস্থায়ী ফাইল তৈরি করে যা sedশেল সহায়তা ছাড়াই নিজেরাই খোলার পক্ষে পুরোপুরি সক্ষম)।
শ্যাডোর্যাঞ্জার

2
  1. প্রদত্ত যে command fileকেবল ফাইলটি খোলে এবং তারপরে কাজ করে যেমন এটি হয় তবে stdinকিছুটা পার্থক্য নেই। শেল পুনর্নির্দেশের সাহায্যে আপনি কেবল বাইনারি নিজেই কমান্ডের বিপরীতে ফাইলটি আগেই খোলেন (শেল দেয়,)।

  2. যদি আমরা cat file | commandবনাম সম্পর্কে কথা বলি command <file, তবে পরবর্তীটি পছন্দ করা হয়। আপনি দু'জনের মধ্যে উল্লেখযোগ্য পারফরম্যান্সের পার্থক্যটি লক্ষ্য করতে যাচ্ছেন না, তবে পূর্ববর্তীটি অযথা জটিল (অতিরিক্ত প্রক্রিয়া এবং পাইপের জন্য ভাগ করা মেমরি বাফার, সীমিত থ্রুপুট সহ) Also এছাড়াও, আপনি seek(ইচ্ছামত ফাইল পয়েন্টার অবস্থান পরিবর্তন করতে পারবেন না ) পাইপ, যখন আপনি একটি সাধারণ ফাইল করতে পারেন। seekইনপুট ফাইলে থাকা-যাওয়া সম্ভব হলে কিছু কমান্ড আরও কার্যকর অ্যালগরিদম ব্যবহার করতে পারে ।


আমি বলব যে কমান্ড ফাইলটি কমান্ড <ফাইলের চেয়ে বেশি পছন্দ করা হয়েছে, কারণ কমান্ডটি একরকম অ-অনুক্রমিক অ্যাক্সেস করতে পারে।
ব্যবহারকারী 606723

এবং এটি এর সাথে এটি করা থেকে কী থামবে <file? আপনার পয়েন্টটি আউটপুট ফাইলের নামটি শক্ত gzip fileকরে যেমন ইনপুট ফাইলের নামটি ব্যবহারের জন্য বৈধ, যেমন: উত্পাদন করে file.gz
অ্যালেক্স

অভ্যন্তরীণভাবে পুনঃনির্দেশ কীভাবে কাজ করে তা আমি বুঝতে পারি না। আসুন আমরা বলি যে আমরা একটি 12 জিবি চলচ্চিত্রকে এমপ্লেয়ার / ভিএলসি তে পুনঃনির্দেশ করি এবং তারপরে আমরা শেষ দিকে চলে যাই। এক্ষেত্রে ঠিক কী হবে?
ব্যবহারকারী 606723

1
শেল ফাইলটি খোলে এবং একটি উপ-প্রক্রিয়া জোর করে, যা ফাইলের বর্ণনাকারীর উত্তরাধিকার সূত্রে প্রাপ্ত হয়। Forked প্রক্রিয়া closeগুলি stdinএবং কলের dupখোলা ফাইল বর্ণনাকারী উপর, তাই এটি পুরানো প্রতিস্থাপন stdinদেখুন সিনেমা খেলোয়াড় বিন্দু থেকে (যা বেশিরভাগ ক্ষেত্রেই TTY কিছু বাছাই ছিল।) সেখানে যে মধ্যে কোন পার্থক্য এটা নাম দ্বারা ফাইলটি খোলার খেলোয়াড় নিজেই। ফাইল বর্ণনাকারী উভয় পরিস্থিতিতেই সন্ধানযোগ্য, তাই আমরা যখন শেষ পর্যন্ত চলে যাই তখন ব্যবহারকারীর সনাক্তকরণযোগ্য কোনও পার্থক্য নেই।
অ্যালেক্স
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.