অন্যান্য কমান্ডে কমান্ড আউটপুট কীভাবে পাইপ করা যায়?


83

উদাহরণ:

ls | echoকিছুই মুদ্রণ করে না (আসলে একটি ফাঁকা লাইন)। আমি এটি ফাইলের একটি তালিকা মুদ্রণ আশা করি।

ls | grep 'foo'অন্যদিকে, প্রত্যাশিত হিসাবে কাজ করে (তাদের নামে 'ফু' দিয়ে ফাইলগুলি মুদ্রণ করে)।

এই পরিস্থিতিতে আমি যা করি তা হ'ল এইরকম: ls | while read OUT; do echo $OUT; doneতবে এটি বরং জটিল।

পাইপিং কেন কিছু কমান্ড দিয়ে কাজ করে তবে অন্যের সাথে নয়? আমি কীভাবে এই সমস্যাটিকে অবরুদ্ধ করতে পারি?


2
আপনি কি আশা ls | echoকরবেন? কেন কেবল চালাবেন না ls?
থিওমেগা

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

xargs এর জন্য -n কমান্ডটিও দেখুন, এতে বলা হয়েছে সাবকম্যান্ডে কত যুক্তি দেওয়া উচিত। `... | xargs -n1 গিট বিড়াল-ফাইলich
সমৃদ্ধ

উত্তর:


118

কমান্ড লাইন আর্গুমেন্ট এবং স্ট্যান্ডার্ড ইনপুট মধ্যে পার্থক্য আছে। একটি পাইপ একটি প্রক্রিয়াটির স্ট্যান্ডার্ড আউটপুটটিকে অন্যটির স্ট্যান্ডার্ড ইনপুটটিতে সংযুক্ত করে। সুতরাং

ls | echo

Ls এর স্ট্যান্ডার্ড আউটপুটটিকে ইকো-র স্ট্যান্ডার্ড ইনপুটকে সংযুক্ত করে। ঠিক আছে? ঠিক আছে, প্রতিধ্বনি স্ট্যান্ডার্ড ইনপুট উপেক্ষা করে এবং এর কমান্ড লাইন যুক্তিগুলি ডাম্প করবে - যা নিজের স্টাডাউটের ক্ষেত্রে এই নয়। আউটপুট: কিছুই না।

এক্ষেত্রে কয়েকটি সমাধান রয়েছে। একটি হ'ল কমান্ড ব্যবহার করা যা স্ট্ডিন পড়ে এবং স্টাডআউটে ডাম্পস পড়ে, যেমন বিড়ালের মতো।

ls | cat

আপনার কাজের সংজ্ঞা কী তা নির্ভর করে 'কাজ করবে'।

তবে জেনারেল কেস সম্পর্কে কী বলা যায়। আপনি যা চান তা হ'ল এক কমান্ডের স্টডআউটকে অন্যের কমান্ড লাইন আর্গগুলিতে রূপান্তর করা। অন্যরা যেমন বলেছে, xargsএই ক্ষেত্রে কি আধ্যাত্মিক সহায়ক সরঞ্জাম, তার কমান্ড লাইনটি তার স্টিডিনের আদেশের জন্য পড়তে এবং চালানোর জন্য আদেশগুলি তৈরি করা।

ls | xargs echo

সাবস্টিটিউশন কমান্ড ব্যবহার করে আপনি এটি কিছু রূপান্তর করতে পারেন could $()

echo $(ls)

আপনি যা চান তা করতে চাইবে।

এই উভয় সরঞ্জামই শেল স্ক্রিপ্টিংয়ের বেশ মূল বিষয়, আপনার উভয়ই শিখতে হবে।

সম্পূর্ণতার জন্য, যেমন আপনি প্রশ্নটিতে ইঙ্গিত করেছেন, স্টিডিনকে কমান্ড লাইন আরগগুলিতে রূপান্তর করার অন্যান্য বেস উপায়টি শেলের বিল্টিন readকমান্ড। এটি "শব্দ" ( IFSভেরিয়েবল দ্বারা সংজ্ঞায়িত শব্দগুলি ) একটি অস্থায়ী ভেরিয়েবলে রূপান্তর করে, যা আপনি যে কোনও কমান্ড রান ব্যবহার করতে পারেন।


1
একটি খুব সহায়ক একটি তথ্যমূলক উত্তর, আপনাকে ধন্যবাদ! আমি বর্তমানে বাশ শিখছি, এবং আমি এর আগে xargs এবং $ (*) স্বরলিপি উভয়ই দেখেছি, তবে সেগুলিতে খুব একটা মনোযোগ দিই নি। এখন আমি জানি যে তারা কতটা গুরুত্বপূর্ণ, এবং অবশ্যই সেগুলিতে সন্ধান করবে।
মিহাই রোটারু

1
এক্সার্গগুলি ওপি যা খুঁজছিল তা হতে পারে।
Iktys

19

ls | echoকোনও ফাঁকা লাইন প্রিন্ট করে কারণ echoকোনও ইনপুট পড়ে না; পাইপলাইনের শেষ কমান্ডটি হ'ল echoএকটি ফাঁকা লাইন ছাড়া কিছুই মুদ্রণ করে না।

সাধারণত:

a | b

আউটপুট এর aইনপুট হয়ে যায় তা নিশ্চিত করে b। আমি আপনাকে Pipelinesবিভাগটি পড়ার পরামর্শ দিচ্ছি man bash


আপনি যদি সত্যিই ব্যবহার করতে চান lsএবং echoএকসাথে এখানে কয়েকটি (বেশ ব্যবহারহীন) উদাহরণ দিয়েছেন:

ls | xargs -L 1 echo
echo `ls`
for i in `ls` ; do echo $i ; done

11

যদি আপনি চাই প্রতি কমান্ড চেষ্টা করুন:echols

ls | xargs echo

এটি echoআউটপুট সঙ্গে কল করবে ls


3
অথবা ls | xargs -I {} echo {}আপনি যদি চান তবে এটি প্রতিটি লাইনের জন্য পৃথকভাবে কল করা উচিত
অ্যালেক্স আবদুগাফরোভ

3

কেন সহজভাবে ব্যবহার করবেন না:

echo `ls`

বা আরও নিরাপদ:

echo "`ls -lrt`"

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