লিনাক্স পাইপ প্রতীক "|" কি করে? [প্রতিলিপি]


23

এখানে একটি কমান্ড রয়েছে যা ফোল্ডারে বিপরীত ক্রমে ফাইলগুলি বাছাই করে

ls | sort -r

|এই আদেশের প্রতীকটি কী করে ?

আমি এখানে যা খুঁজছি তা হ'ল লিনাক্স শুরুর জন্য পাইপগুলির উচ্চ স্তরের (বুঝতে সহজ) ব্যাখ্যা। আমি পাইপ সম্পর্কে অন্যান্য প্রশ্নগুলি এখানে সুপারইউজারে দেখতে পাচ্ছি, তবে এমন কোনও উত্তর নেই যা একটি সহজ উত্তর দেয় যা তারা কী করে এবং কীভাবে তারা পুনঃনির্দেশের ( >বা <প্রতীক) থেকে পৃথক হয় তা ব্যাখ্যা করে ।


7
লিনাক্সের সাথে এটির কোনও সম্পর্ক নেই (যা কার্নেল)। পাইপগুলি সাধারণভাবে ইনপুট / আউটপুটকে পুনর্নির্দেশের একটি মাধ্যম, বাশের মতো শেলের মধ্যে এটি আলাদা নয়। এ সম্পর্কিত একমাত্র বিশেষ বিষয় |হ'ল এটি কোনও নাম ব্যবহার করে না, এল-হ্যান্ড কমান্ড থেকে আউটপুটটি পাইপের আর-হাতের কমান্ডের জন্য সরাসরি ইনপুটগুলিতে প্রেরণ করা হয়।
অ্যান্ডন এম। কোলেম্যান


ls -1r(এক নম্বর আর্গুমেন্টটি নোট করুন) এর সাথে একই ফলাফল পাওয়া উচিত ls | sort -r
ইভান চাউ

আমি এটি সেভাবে ব্যাখ্যা করতে চাই: একটি পাইপ একটি কমান্ডের আউটপুট নেয় এবং নিম্নলিখিত কমান্ডের জন্য এটি ব্যবহারযোগ্য করে তোলে। উদাহরণস্বরূপ, আপনি করতে পারেন cat /somefile | grep cool। এটি সামফাইলের আউটপুট নেবে এবং এটি গ্রেপের জন্য উপলভ্য করবে এবং তারপরে গ্রেপ এতে শীতল শব্দের সাথে সমস্ত লাইন মুদ্রণ করবে।
জনডোয়ে

উত্তর:


26

নতুন ব্যবহারকারীদের সাহায্যের জন্য নিম্নলিখিতটি কিছুটা সরলীকৃত করা হয়েছে।

ভাল, প্রথমে, স্ট্যান্ডার্ড ইনপুট এবং স্ট্যান্ডার্ড আউটপুট ধারণাটি বোঝা দরকার।

লিনাক্স এবং অন্যান্য ইউনিক্স-এর মতো অপারেটিং সিস্টেমে প্রতিটি প্রক্রিয়াটির একটি স্ট্যান্ডার্ড ইনপুট ( stdin) এবং একটি স্ট্যান্ডার্ড আউটপুট থাকে stdout। স্বাভাবিক পরিস্থিতিটি হ'ল stdinআপনার কীবোর্ড এবং stdoutএটি আপনার স্ক্রিন বা টার্মিনাল উইন্ডো।

সুতরাং আপনি যখন চালান ls, এটি এটি আউটপুট নিক্ষেপ করা হবে stdout। আপনি যদি অন্য কিছু না করেন তবে এটি আপনার স্ক্রিন বা টার্মিনাল উইন্ডোতে যাবে এবং আপনি এটি দেখতে পাবেন।

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

তবে, অ-ইন্টারেক্টিভ বা "ফিল্টার" কমান্ডগুলি রয়েছে যা ইন্টারেক্টিভভাবে কাজ করে না, তবে একগুচ্ছ ডেটা চায়। এই আদেশগুলি সমস্ত stdinকিছু গ্রহণ করবে, এটিতে কিছু করবে এবং তারপরে এটি নিক্ষেপ করবেstdout

আসুন অন্য একটি কমান্ড দেখুন du- ডিস্ক ব্যবহারের জন্য দাঁড়িয়েছে। du /usrউদাহরণস্বরূপ, stdoutডিরেক্টরিটির প্রতিটি ফাইলের একটি তালিকা ( অন্য কোনও লিনাক্স কমান্ড পছন্দ করতে) প্রিন্ট আউট করবে এবং এর আকার হবে:

# du /usr
2312    /usr/games
124     /usr/lib/tc
692     /usr/lib/rygel-1.0
400     /usr/lib/apt/methods
40      /usr/lib/apt/solvers
444     /usr/lib/apt
6772    /usr/lib/gnash

আপনি ঠিক ব্যাট থেকে বলতে পারেন, এটি বাছাই করা হয় না এবং আপনি সম্ভবত এটি আকারের অনুসারে বাছাই করতে চান।

sortহ'ল সেই "ফিল্টার" কমান্ডগুলির মধ্যে একটি যা এখান থেকে অনেকগুলি স্টাফ নেবে stdinএবং এটি বাছাই করবে।

সুতরাং, আমরা যদি এটি করি:

# du /usr | sort -nr

আমরা এটি পেয়েছি, যা কিছুটা ভাল:

4213348 /usr
2070308 /usr/lib
1747764 /usr/share
583668  /usr/lib/vmware
501700  /usr/share/locale
366476  /usr/lib/x86_64-linux-gnu
318660  /usr/lib/libreoffice
295388  /usr/lib/vmware/modules
290376  /usr/lib/vmware/modules/binary
279056  /usr/lib/libreoffice/program
216980  /usr/share/icons

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

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

কোনও প্রোগ্রামের পক্ষে stdinইন্টারেক্টিভ কিনা তা বলা সম্ভব , তাই আপনি যদি নিজেরাই বা পাইপের শেষে এগুলি প্রকাশ করেন তবে কিছু প্রোগ্রাম আলাদাভাবে কাজ করতে পারে।

এছাড়াও, এমন কোনও প্রোগ্রামের পাইপিং যা কেবল ইন্টারেক্টিভভাবে কাজ করে, যেমন vi, আপনার খারাপ সময় আসবে।

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


নোট করুন যে এটি লিনাক্স, এমনকি পসিক্সেরও অনন্য নয়। উইন্ডোজের বেশিরভাগ (সমস্ত?) শেলও এটি করে। এবং সম্ভবত অন্যান্য ওএস।
বব

আমি জানি যে লিনাক্সের অধীনে উইন্ডোজ এর ধারণার ধারণাটি আলাদা stdinএবং stdoutতার চেয়ে ভিন্ন, যদিও উইন্ডোজ cmd.exeবা পাওয়ারশেলের দৃষ্টিভঙ্গি থেকে সম্ভবত খুব বেশি নয় ।
LawrenceC

এটি কীভাবে আলাদা তা সম্পর্কে আমি বেশ কৌতূহলী - আপনি কি ব্যাখ্যা করতে মনস্থ করবেন? মন্তব্যগুলি যদি এটির জন্য ভাল জায়গা না হয় তবে আড্ডায়।
বব

1
উইন 32 প্রোগ্রামগুলির অবশ্যই স্ট্যান্ডার্ড ইনপুট এবং আউটপুট থাকে। উদাহরণস্বরূপ, আপনি Win32 ফাংশন সহ আপনার প্রক্রিয়াটির স্ট্যান্ডার্ড ইনপুট, আউটপুট বা ত্রুটি হ্যান্ডেলটি পুনরুদ্ধার করতে পারেন GetStdHandle()। এটি নেট (NET) দ্বারা প্রসারিত [শিশু] প্রক্রিয়াটির স্ট্যান্ডার্ড স্ট্রিমগুলি পুনর্নির্দেশ করা খুব ছোট বিষয় N
বব

1
আহ, এখানে উইন 32 সমতুল্য, STARTUPINFOস্ট্রাক্টে উপযুক্ত পরামিতিগুলি সেট করে CreateProcess()
বব

27

আপনি যদি আউটপুট এবং ইনপুট পুনঃনির্দেশের সাথে স্বাচ্ছন্দ্য বোধ করেন তবে ব্যাখ্যাটি খুব সহজ।

Command1 | Command2

হিসাবে একই

Command1 > tempfile
Command2 < tempfile

কিন্তু ছাড়া tempfile। এর আউটপুট Command1সরাসরি ইনপুটটির সাথে সংযুক্ত Command2থাকে এবং স্থানান্তরটি স্মৃতিতে ঘটে।


আমি ভুল হতে পারি তবে আমি মনে করি পাইপ সিনট্যাক্সেও টেম্পাইলটি বিদ্যমান। এটির কোনও নাম নেই।
তাইমির

3
না এটা না। এক কমান্ড থেকে অন্য কমান্ডের ইনপুটটিতে আউটপুট পাইপ করার সময় কোনও ফাইল সিস্টেম অপারেশন জড়িত থাকে না।
ড্যানিয়েল বি

1
যদিও, ডস (এবং সম্ভবত উইন্ডোজ) অধীনে, একটি টেম্প ফাইল হয় নল দ্বারা নির্মিত। * নিক্স নয়, তবে কোনও পার্থক্য নেই।
জেরেমি জে স্টারচার

আমি নিশ্চিত যে এটি সঠিক নয়। প্রক্রিয়া মনিটর আপনার দাবির পিছনে নোটিশ দেয় CreateFileবা WriteFileকল দেয় reports / সম্পাদনা: এটি অবশ্যই উইন্ডোজ অংশের জন্য।
ড্যানিয়েল বি

3

সত্যিই যদি আপনি জানতে চান যে পাইপগুলি কী করে এবং> এবং | এর মধ্যে পার্থক্য রয়েছে, তবে প্রচুর ফাইল সহ একটি ডিরেক্টরিতে যান এবং

টার্মিনাল ls বনাম ls | more (বা ডিআইআর এবং ডিআইআর সহ উইন্ডোজ থেকে এটি করা | আরও)

আপনি যদি আরও> ব্যবহার করেন তবে আপনি দেখতে পাবেন যে এটি 'আরও' কমান্ডের পরিবর্তে ls এর আউটপুট না পাঠিয়ে 'আরও' নামে একটি ফাইল তৈরি করে। সুতরাং যদি কেউ> আরও কিছু করে তবে সম্ভবত এটি একটি ভুল হয়ে থাকে, কেউ ফাইল> 1 এর চেয়ে বেশি করবে না> ফাইল1। মোর একটি সুপরিচিত কমান্ড।

<টি> মত> একটি কমান্ডের চেয়ে কমান্ডের পরিবর্তে একটি কমান্ড এবং একটি ফাইল লিঙ্ক করার জন্য। তবে> একটি কমান্ডের আউটপুট কোনও ফাইলে প্রেরণ করার সময় <কমান্ডের কাছে একটি ফাইলকে ইনপুট হিসাবে প্রেরণ করে। আমি সাধারণত ক্যাট ফাইল ফাইল 1 ব্যবহার করি হিসাবে খুব কমই ব্যবহার করি একটি কমান্ডে একটি ফাইল আউটপুট প্রেরণ।

$ গ্রেপ একটি <ফাইল1 এবিসি

$ বিড়াল ফাইল 1 | গ্রেপ একটি এবিসি

2 পরামিতি সহ গ্রেপ হ'ল গ্রেপ প্যাটার্ন ফাইল form একটি পরামিতি সহ গ্রেপ গ্রেপ প্যাটার্ন। এবং আপনি এটিতে ফাইলের সামগ্রীগুলি পাইপ করে বা <ব্যবহার করে ফাইলটি প্রেরণ করতে পারেন। <ব্যবহার করা হয়, আপনি প্রথমে কমান্ডের নাম লিখুন, তারপরে ফাইলের নাম আদেশের পরে <ফাইল করুন < | ব্যবহার করলে | কোনও ফাইলের বিষয়বস্তুগুলি পাইপ করতে, আপনি বিড়াল ফাইল 1 ব্যবহার করেন কমান্ড।

এছাড়াও অনেকগুলি কমান্ড একটি ফাইলকে ইনপুট হিসাবে গ্রহণ করে যাইহোক, তাই ফাইল ফাইল 1 গ্রেপ করুন, ঠিক যেমন বিড়াল ফাইল 1 | গ্রেপ এ, এবং একটি <ফাইল 1 গ্রেপ করুন।

আমি 15 বছর আগে ডসগুলিতে পাইপ (|) এবং> করছিলাম।

কিভাবে সংক্ষেপে <এবং> থেকে পৃথক - পাইপটি 2 কমান্ডের মধ্যে বসে <ও> এবং একটি আদেশ এবং একটি ফাইলের মধ্যে বসে। >> একটি ফাইলের আউটপুট is <একটি ফাইল থেকে ইনপুট।


3

পাইপ অক্ষর ( |) একটি প্রোগ্রামের আউটপুটটিকে অন্যটির ইনপুটকে সংযুক্ত করে।

এই উদাহরণে echoশব্দটি মুদ্রণ করে helloএবং এর wc -cইনপুটটির একটি চরিত্র গণনা করে:

echo hello | wc -c

আমি মনে করি আপনার একবারে বলা উচিত যে প্রতিধ্বনি "হ্যালো \ n" আউটপুট করবে। আপনি ওপিকে অধ্যয়নের জন্য বলছেন না, আপনি যারা আপনার উত্তরটি পড়েছেন তাদের প্রত্যেককে এটি বলছেন। এই সময়ের অপচয়কে কেন গুণ করবে?
রডরিগো

প্রতিক্রিয়াটির জন্য ধন্যবাদ, আমি আমার উত্তরটি সংক্ষিপ্ত করে দিয়েছি।
bbaassssiiee

2

এটি বোঝার জন্য, নিজে চেষ্টা করে দেখুন:

sort -r

এখন আপনি একটি কার্সার দিয়ে ঝুলছেন, এবং এটি কিছুই করছে না। আপনি যদি কিছু ডেটা টাইপ করেন তবে কী হবে?

1
2
3
5
4

এখনও কিছু না, তাই না? এখন ctrl + D টিপুন

5
4
3
2
1

সুতরাং কি বাছাই তা হয়, এটি ইনপুট লাগে (আপনি কি টাইপ করেছেন), এটি দিয়ে কিছু করে (সাজানো) এবং আউটপুট হিসাবে এটি ফেরত দেয়। lsকমান্ড ইনপুট লাগবে না, এটি শুধুমাত্র আউটপুট জেনারেট করে। পাইপ চিহ্নটি আউটপুট থেকে নেয় lsএবং sortকমান্ডের ইনপুট হিসাবে এটি ফিড করে ।

>কোনও প্রোগ্রামকে আউটপুট সরবরাহ করে না, তবে আউটপুটটিকে ফাইল হিসাবে সঞ্চয় করে। <ইনপুট হিসাবে একটি ফাইল ব্যবহার করে।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.