বাশে পাইপগুলিতে কীভাবে ইনপুট পাঠানো হয় তা বোঝা যাচ্ছে


17

পাইপ কীভাবে ব্যাশে কাজ করে তা আমি যথেষ্ট বুঝতে পারি না।

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

আউটপুট কী তা আমি পেতে পারি কারণ এটি কমান্ডটি স্ক্রিনে প্রিন্ট করে।

তবে কীভাবে আমি জানব যে কোনও আদেশ কোনও ইনপুট গ্রহণ করবে?

এখানে একটি উদাহরণ যা আমি ভেবেছিলাম কাজ করবে:

which gem | rm

দুর্ভাগ্যক্রমে তা হয়নি।

কোন মণি প্রিন্ট করে /usr/bin/gemতাই আউটপুটটি সঠিক হতে হবে?

আমি ভেবেছিলাম যে এটি আরএমকে দেওয়া হয়েছিল তাই এটি ভয়াবহ হতে পারে rm /usr/bin/gemতবে আমি ভুল ছিল।

সুতরাং আমার প্রশ্নটি হ'ল আমি কীভাবে জানতে পারি যে কোনও আদেশ কোনও ইনপুট নেয়?


2
অন্য কিছু বাদে, rm /usr/bin/gemএকটি ভয়ঙ্কর ধারণা। ত্যাগ করে gem(এবং Ruby ইন্টারপ্রেটারের এটা সঙ্গে যায়) একা এবং আপনার পছন্দের Ruby ইন্টারপ্রেটারের ইনস্টল (এবং gem) ব্যবহার rvm: rvm.beginrescueend.com
Telemachus

উত্তর:


23

"ইনপুট" এবং "কমান্ড লাইন আর্গুমেন্ট" আলাদা জিনিস।

rm যুক্তি হিসাবে প্রদত্ত ফাইলগুলি সরিয়ে দেয়।

একটি পাইপ বাম-কমান্ডের আউটপুটটিকে ডান-হাত কমান্ডের ইনপুটটিতে পুনঃনির্দেশ করে। এটি ডানদিকে প্রোগ্রামের কমান্ড লাইন আর্গুমেন্টকে প্রভাবিত করে না।

আপনি যা করতে চাইছেন তা করতে, xargsকোনও প্রোগ্রাম চালানোর জন্য স্ট্যান্ডার্ড ইনপুটটি কমান্ড-লাইন আর্গুমেন্টে রূপান্তর করার চেষ্টা করুন। এটা তার কাজ।

which gem | xargs rmউদাহরণস্বরূপ, gemআপনার PATH এটিকে সরিয়ে ফেলবে ।


12

rmইনপুট নেয় না, এটি আর্গুমেন্ট নেয়। এগুলি আলাদা। আর্গুমেন্টগুলি হ'ল সুইচ এবং ফাইলের নাম এবং এর ফলে আপনি কমান্ড লাইনের একটি প্রোগ্রামকে এর আচরণকে প্রভাবিত করতে দেন। ইনপুট হ'ল ডেটা যা প্রোগ্রামটি কাজ করে। উদাহরণস্বরূপ, grepইনপুট এবং তর্কগুলি উভয়ই গ্রহণ করে:

grep "foo" file.txt

সেখানে দুটি যুক্তি রয়েছে "foo"এবং file.txtইনপুট হয় বিষয়বস্তু এর file.txtনা স্ট্রিং file.txtনিজেই। যেহেতু গ্রেপ ইনপুট নেয়, আপনি এটি পাইপ দিয়ে ব্যবহার করতে পারেন:

cat file.txt | grep "foo"

একই আউটপুট উত্পাদন করে যেহেতু বিড়াল নিচ্ছে file.txtএকটি আর্গুমেন্ট হিসাবে, এবং প্রযোজনার বিষয়বস্তু এর file.txtআউটপুট। সেই আউটপুটটি গ্রেপ-এ পাইপ করা হয়, গ্রাইপ ফাইলটি খোলার মতো একই প্রভাব দেয় যেমন প্রথম উদাহরণ হিসাবে example

আপনি যদি একটি প্রোগ্রামের আউটপুটটিকে অন্যটির পক্ষে যুক্তি হিসাবে ব্যবহার করতে চান তবে আপনি ব্যাকটিক্স ব্যবহার করেন:

rm `which gem`

বা এই বিকল্প (বাশ-নির্দিষ্ট) বাক্য গঠন:

rm $(which gem)

সম্পাদনা করুন: বা xargsঅন্য উত্তরদাতা হিসাবে উল্লেখ করেছেন। কমান্ড লাইনের সাহায্যে বিড়ালকে ত্বকে নেওয়ার বিভিন্ন উপায়।


এটি লক্ষণীয় যে এর cat file.txt | grep "foo"চেয়ে কয়েকগুণ ধীর হতে পারে grep "foo" file.txt
বোরিলিড

1
এই অংশটি আমি পাই না। আমি কীভাবে জানতে পারি যে একটি আর্গুমেন্ট কী এবং স্ট্যান্ডার্ড ইনপুট কী?
আজসি

8
@ আজসি: আপনি যদি প্রোগ্রামটির নাম পরে এবং এন্টার টিপানোর আগে এটি টাইপ করেন তবে এটি একটি যুক্তি। আপনি যদি প্রোগ্রামটি এটি চলমান শুরু হওয়ার পরে টাইপ করেন তবে এটি স্ট্যান্ডার্ড ইনপুট।
বোরিলিড

1
বুঝেছি! এটি সবকিছু ব্যাখ্যা করে। এখন আমি জানি যে আমি উভয়ই সরাসরি কমান্ডটি ব্যবহার করতে পারি এবং এটি আমাকে (গ্রেপ) প্রম্প্ট করে কিনা তা দেখতে পারি এবং এটি স্ট্যান্ড ইনপুট ব্যবহার করে কিনা তা জানতে আমি ম্যানুয়াল (ম্যান গ্রেপ) পড়তে পারি।
আজজি

@ জাজি: আপনি যদি ম্যানপেইজে ডুব দিতে না চান grep --help, তবে যুক্তিগুলির তাত্ক্ষণিক স্বীকৃতি জানাতে হবে।
1010

3

manআপনার আগ্রহী কমান্ডের পৃষ্ঠাগুলি পরীক্ষা করুন These এই প্রোগ্রামগুলি নির্দেশ করে যে সেগুলি পড়েছিল stdin( man grepস্ট্যান্ডিন পড়া একটি জনপ্রিয় কমান্ডের জন্য চেষ্টা করুন )।


আমি চেষ্টা করেছিলাম man grep | grep 'standard input'এবং If no file arguments are specified, the standard input is used.শেষ ম্যাচ হিসাবে পেয়েছিলাম । Its আমাকে grepএর নিজস্ব ওষুধের স্বাদ দিতে হয়েছিল । 😎
ma11hew28

2

আপনার প্যাথএইচএইচটিতে এমন একটি ডিরেক্টরি রয়েছে যাতে স্থান রয়েছে বা কমান্ডের নামটিতে স্থান রয়েছে: এগুলি চালানো সমস্ত বিপজ্জনক:

rm `which gem`       # Dangerous
rm $(which gem)      # Dangerous
which gem | xargs rm # Dangerous

জিএনইউ সমান্তরাল http: // www.gnu.org/software/parallel/ এর সমস্যা নেই, সুতরাং এটি আপনার প্যাথএইচএইচ ডিরেক্টরিতে স্থান অন্তর্ভুক্ত থাকলে বা কমান্ডের নামটি স্থান অন্তর্ভুক্ত থাকলেও এটি কাজ করবে:

which gem | parallel rm
parallel -a <(which bass) rm

জিএনইউ সমান্তরালের জন্য অন্তর্ভুক্ত ভিডিওটি দেখুন: http://www.youtube.com/watch?v=OpaiGYxkSuQ

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