পাইপ ব্যবহার করে একটি কমান্ডে দুটি আর্গুমেন্ট পাস করা


22

সাধারণত, আমাদের কেবল একটি যুক্তি পাস করতে হবে:

echo abc | cat
echo abc | cat some_file -
echo abc | cat - some_file

দুটি যুক্তি পাস করার উপায় আছে? কিছুটা এইরকম

{echo abc , echo xyz} | cat
cat `echo abc` `echo xyz`

আমি প্রথমে উভয় ফলাফল প্রথমে একটি ফাইলে সঞ্চয় করতে পারি

echo abc > file1
echo xyz > file2
cat file1 file2

তবে আমি ঘটনাক্রমে কোনও ফাইল ওভাররাইট করে ফেলতে পারি, যা ঠিক নেই। এটি একটি অ-ইন্টারেক্টিভ স্ক্রিপ্টে চলেছে। মূলত, আমার catকাছে কোনও ফাইল না লিখে দুটি সালিশী কমান্ডের ফলাফল পাস করার একটি উপায় প্রয়োজন ।


আপডেট: দুঃখিত, উদাহরণটি সমস্যার মুখোশ দেয়। যদিও { echo abc ; echo xyz ; } | catকাজ বলে মনে হচ্ছে না, আউটপুট কারণে echoগুলি না cat

এর চেয়ে ভাল উদাহরণ হ'ল { cut -f2 -d, file1; cut -f1 -d, file2; } | paste -d,যা প্রত্যাশার মতো কাজ করে না।

সঙ্গে

file1:
a,b
c,d

file2:
1,2
3,4

প্রত্যাশিত আউটপুট হল:

b,1
d,3

সমাধান হয়েছে:

প্রক্রিয়া বিকল্প ব্যবহার করুন :cat <(command1) <(command2)

বিকল্পভাবে, নামযুক্ত পাইপগুলি ব্যবহার করে তৈরি করুন mkfifo:

mkfifo temp1
mkfifo temp2
command1 > temp1 &
command2 > temp2 &
cat temp1 temp2

কম মার্জিত এবং আরও ভার্বোজ, তবে যতক্ষণ না আপনি টেম্প 1 এবং টেম্প 2 এর আগে হাতের অস্তিত্ব নেই তা নিশ্চিত করেন না works


1
এটি আমার মাথা আঁচড়ান। আপনি একটি বিড়াল দুটি পৃথক কমান্ড পাইপ করতে চান?
ব্যবহারকারী 606723

2
আপনি কি জানেন যে "পাইপিং" এবং "তর্কগুলি" দুটি সম্পূর্ণ সম্পর্কযুক্ত নয়, তাই না?
Ignacio Vazquez-Abram

@ ইগনাসিও এরর ... লিনাক্সের সাথে আমি তেমন পরিচিত নই তাই আমি আসলে পার্থক্যটি জানি না। আমি সবসময় পাইপিংয়ের অর্থ এটি পূর্ববর্তী ফলাফলকে যুক্তি হিসাবে গ্রহণ করে। আমাকে আলোকিত করার যত্ন?
গোওয়ান

@ ফায়ারবাট নং, পাইপ এর অর্থ পূর্ববর্তী কমান্ডের স্ট্যান্ডআউটটিকে পরবর্তী কমান্ডের স্ট্যান্ডার্ড ইনপুট হিসাবে গ্রহণ করা। আপনার এখনও তর্ক থাকতে পারে, যা ভিন্ন ধারণা।
ধনী হোমোলকা

এছাড়াও, আপনার আপডেট পাঠ্য হিসাবে, আউটপুটটি বিড়াল থেকে আসে না, কেবল আপনি চান যে বিবৃতিগুলি বিড়ালের মতো আলাদা বলে মনে হয়, যা সেগুলি করতে পারে না কারণ সেগুলি একটি স্ট্রিমায় সিরিয়াল করা হয়েছে।
ধনী হোমোলকা

উত্তর:


17

আমি মনে করি আপনি 'প্রক্রিয়া সাবস্টিটিউশন' চান http://tldp.org/LDP/abs/html/process-sub.html । এটি zsh এও কাজ করে, যদিও এর আরও বিকল্প রয়েছে এবং বাক্য গঠনটি ভিন্ন হতে পারে।

এটি /dev/fd/somethingপ্রতিটি প্রতিস্থাপনের জন্য সিউডো ফাইল ( ) তৈরি করে। এটি বেশ কার্যকর। কমান্ডটি কেবলমাত্র একটি স্ট্রিম হিসাবে পড়তে পারে, যার অর্থ এটি ফিসেকের সাথে পিছনে যেতে পারে না। এটি পাইপের মতো বাইটের স্রোত হিসাবে পড়তে হবে।

আপনার উদাহরণগুলি প্রক্রিয়া বিকল্প হিসাবে কাজ করে:

cat <(echo abc) <(echo xyz)
paste -d, <(cut -f2 -d, file1) <(cut -f1 -d, file2)

এটিকে কোনও প্রক্রিয়াটি ব্যবহার করার সরঞ্জাম হিসাবে ভাবেন এবং এটি কোনও অস্থায়ী ফাইল ছাড়াই ফাইল হওয়ার ভান করুন।

(আমার আগের উত্তর থেকে )


2

কোঁকড়া ধনুর্বন্ধনী ক্রেস্টি আসলে কাজ করেছিল কারণ পাইপ অপারেটর তৃতীয়টির স্ট্যান্ডার্ড ইনপুটগুলিতে গ্রুপযুক্ত কমান্ডগুলির স্ট্যান্ডার্ড আউটপুটগুলিকে সংযুক্ত করবে।

আপনি বলতে পারেন যে প্রিন্টআউট কোনও কমান্ড চালিত করে ইকো থেকে আসে না যা স্ট্যান্ডার্ড ইনপুট ব্যবহার করে না, উদাহরণস্বরূপ { echo 1; echo 2;} | echo 31 \ n2 \ n3 এর বিপরীতে 3 প্রিন্ট করবে।

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

আপনি mktempএকটি অনন্য অস্থায়ী ফাইল mkfifoতৈরি করতে বা একটি ফিফো পাইপ ফাইল তৈরি করতে ব্যবহার করতে পারেন ।


আপনার উত্তরের জন্য একটি বড় ধন্যবাদ, আমি এই সমাধানের জন্য অনেক দিন অনুসন্ধান করেছি এবং অবশেষে আপনার উত্তরটি এখানে পেয়েছি।
সাইদ ফালাসাফিন

2

আমি xargs পছন্দ করি একটি উদাহরণ হিসাবে আমি / ইউএসআর / লোকাল এর অধীনে সমস্ত মাইএসকিএল ডেটা ডিয়ার আকার খুঁজতে চাই

osx: স্থানীয় ব্যবহারকারী w পিডাব্লুড
, / Usr / স্থানীয়
osx: স্থানীয় ব্যবহারকারী s ls | গ্রেপ মাইএসকিএল
মাইএসকিউএল
মাইএসকিউএল-5.0.51a-osx10.5-, x86_64
মাইএসকিউএল-5.0.51b-osx10.5-, x86_64
মাইএসকিউএল-5.1.39-osx10.5-, x86_64
মাইএসকিউএল-5.6.17-osx10.7-, x86_64
OS x: স্থানীয় ব্যবহারকারী s ls | grep mysql | sudo xargs du -sh
4.0K মাইএসকিএল
2.8G mysql-5.0.51a-osx10.5-x86_64
 10 জি mysql-5.0.51b-osx10.5-x86_64
 25 জি mysql-5.1.39-osx10.5-x86_64
753M mysql-5.6.17-osx10.7-x86_64
osx: স্থানীয় ব্যবহারকারী $ 

xargs

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