Xargs সহ একাধিক কমান্ড চালানো


310
cat a.txt | xargs -I % echo %

উপরের উদাহরণে, xargs echo %কমান্ড আর্গুমেন্ট হিসাবে গ্রহণ করে। তবে কিছু ক্ষেত্রে আমার একের পরিবর্তে যুক্তি প্রক্রিয়াকরণের জন্য একাধিক কমান্ডের প্রয়োজন। উদাহরণ স্বরূপ:

cat a.txt | xargs -I % {command1; command2; ... }

তবে xargs এই ফর্মটি গ্রহণ করে না। আমার জানা একটি সমাধান হ'ল আমি আদেশগুলি মোড়ানোর জন্য কোনও ক্রিয়াটি সংজ্ঞায়িত করতে পারি, তবে এটি পাইপলাইন নয়, আমি এটি পছন্দ করি না। অন্য কোন সমাধান আছে কি?


1
এই উত্তরগুলির বেশিরভাগই সুরক্ষা দুর্বলতাসম্ভাব্য ভাল উত্তরের জন্য এখানে দেখুন।
মতিন উলহাক

2
আমি প্রায় সব কিছুর জন্য xargs ব্যবহার করি, তবে স্ট্রিংয়ের ভিতরে কমান্ড স্থাপন করা এবং স্পষ্টভাবে সাবশেলগুলি তৈরি করা আমি ঘৃণা করি। আমি এমন whileলুপে পাইপ কীভাবে শিখতে চাইছি যাতে একাধিক কমান্ড থাকতে পারে।
শ্রীধর সারনোবাত

উত্তর:


443
cat a.txt | xargs -d $'\n' sh -c 'for arg do command1 "$arg"; command2 "$arg"; ...; done' _

... বা, বিড়ালের অকেজো ব্যবহার ছাড়াই :

<a.txt xargs -d $'\n' sh -c 'for arg do command1 "$arg"; command2 "$arg"; ...; done' _

কিছু সূক্ষ্ম বিষয় ব্যাখ্যা করার জন্য:

  • ব্যবহারের "$arg"পরিবর্তে %(এবং অভাবে -Iমধ্যে xargsকমান্ড লাইন) নিরাপত্তার কারণে হল: তথ্য পাসিং shপরিবর্তে 'র কম্যান্ড-লাইন আর্গুমেন্ট তালিকার কোড বাধা বিষয়বস্তু সেটিকে বদলে যে ডেটা যেমন (থাকতে পারে $(rm -rf ~)একটি বিশেষভাবে নিতে দূষিত উদাহরণ) কোড হিসাবে মৃত্যুদন্ড কার্যকর করা থেকে।

  • একইভাবে, এর ব্যবহার -d $'\n'হ'ল একটি জিএনইউ এক্সটেনশন যা xargsইনপুট ফাইলের প্রতিটি লাইনকে পৃথক ডেটা আইটেম হিসাবে বিবেচনা করে। হয় এটি বা -0(যা নিউলাইনগুলির পরিবর্তে NULs প্রত্যাশা করে) জার্সগুলিকে এটি প্রবাহিত স্ট্রিমটিতে পার্সিংয়ের শেল-জাতীয় (তবে যথেষ্ট শেল-সামঞ্জস্যপূর্ণ নয়) প্রয়োগ করার চেষ্টা থেকে বিরত রাখতে প্রয়োজনীয় । (আপনার যদি জিএনইউ এক্সার্গস না থাকে তবে আপনি tr '\n' '\0' <a.txt | xargs -0 ...লাইন-ভিত্তিক পড়া ছাড়া ব্যবহার করতে পারেন -d)।

  • _একটি স্থানধারক জন্য $0, যেমন যে দ্বারা যোগ অন্য ডেটা মান xargsপরিণত $1এবং অনওয়ার্ড, যা মান ডিফল্ট সেট একটি হতে হবে forলুপ উপর iterates।


58
যারা অপরিচিত তাদের জন্য sh -c- নোট করুন যে প্রতিটি কমান্ডের পরে সেমিকোলনটি alচ্ছিক নয়, এমনকি যদি এটি তালিকার শেষ কমান্ড হয়।
নোহ সুসমান

6
কমপক্ষে আমার কনফিগারেশনে, প্রাথমিক "{" এর পরপরই অবশ্যই একটি স্থান থাকতে হবে। কোঁকড়া ধনুর্বন্ধনী শেষ হওয়ার আগে কোনও স্থানের প্রয়োজন হয় না, তবে মিঃ সুসমান উল্লেখ করেছেন যে আপনার একটি সমাধিক সেমিকোলন দরকার।
উইলডে

4
এই উত্তরের আগে চারদিকে কোঁকড়ানো ধনুর্বন্ধনী ছিল command1এবং command2; আমি পরে বুঝতে পারি যে এগুলি প্রয়োজনীয় নয়।
কিথ থম্পসন

24
সেমিকোলন সম্পর্কে উপরোক্ত মন্তব্যগুলি স্পষ্ট করতে, একটি সমাপ্তির আগে একটি সেমিকোলন প্রয়োজন }: sh -c '{ command1; command2; }' -- but it's not required at the end of a command sequence that doesn't use braces: sh -c 'কমান্ড 1; কমান্ড 2'`
কিথ থম্পসন

8
আপনি যদি %আপনার স্ট্রিংয়ের কোথাও এই চরিত্রটি প্রবেশ করিয়ে থাকেন sh -cতবে তা সুরক্ষিত দূর্বলতার ঝুঁকির মধ্যে রয়েছে: একটি ফাইলনাম $(rm -rf ~)'$(rm -rf ~)'(এবং এটি সাধারণ ইউনিক্স ফাইল সিস্টেমে কোনও ফাইলনামের মধ্যে থাকা একদম আইনী স্ট্রিং !) কারও খুব খারাপ দিন ঘটায় ।
চার্লস ডাফি

35

জিএনইউ সমান্তরাল দিয়ে আপনি এটি করতে পারেন:

cat a.txt | parallel 'command1 {}; command2 {}; ...; '

আরও জানতে ইন্ট্রো ভিডিওগুলি দেখুন: https://www.youtube.com/playlist?list=PL284C9FF2488BC6D1

সুরক্ষার কারণে আপনার প্যাকেজ ম্যানেজারটি ইনস্টল করতে ব্যবহার করার পরামর্শ দেওয়া হচ্ছে। তবে আপনি যদি এটি না করতে পারেন তবে আপনি এটি 10 ​​সেকেন্ডের ইনস্টলেশনটি ব্যবহার করতে পারেন।

10 সেকেন্ডের ইনস্টলেশনটি একটি সম্পূর্ণ ইনস্টলেশন করার চেষ্টা করবে; যদি এটি ব্যর্থ হয়, একটি ব্যক্তিগত ইনস্টলেশন; যদি এটি ব্যর্থ হয়, একটি সর্বনিম্ন ইনস্টলেশন।

$ (wget -O - pi.dk/3 || lynx -source pi.dk/3 || curl pi.dk/3/ || \
   fetch -o - http://pi.dk/3 ) > install.sh
$ sha1sum install.sh | grep 3374ec53bacb199b245af2dda86df6c9
12345678 3374ec53 bacb199b 245af2dd a86df6c9
$ md5sum install.sh | grep 029a9ac06e8b5bc6052eac57b2c3c9ca
029a9ac0 6e8b5bc6 052eac57 b2c3c9ca
$ sha512sum install.sh | grep f517006d9897747bed8a4694b1acba1b
40f53af6 9e20dae5 713ba06c f517006d 9897747b ed8a4694 b1acba1b 1464beb4
60055629 3f2356f3 3e9c4e3c 76e3f3af a9db4b32 bd33322b 975696fc e6b23cfb
$ bash install.sh

56
অজানা সাইটগুলি থেকে এলোমেলো স্ক্রিপ্টগুলির মাধ্যমে সরঞ্জামগুলি ইনস্টল করা ভয়ঙ্কর অনুশীলন। SH ... | সমান্তরাল জনপ্রিয় ডিস্ট্রো, যা বিশ্বাস করা যাবে জন্য oficiall প্যাকেজ (কিছু প্রসারিত করতে) পথ বেশি র্যান্ডম wget হয় হয়েছে
mdrozdziel

4
আসুন আমরা দেখতে পারি সবচেয়ে সহজ আক্রমণ ভেক্টরটি কী: পাই.ডিকে GNU সমান্তরালের লেখক দ্বারা নিয়ন্ত্রিত হয়, যাতে আক্রমণ করার জন্য আপনাকে সার্ভারে প্রবেশ করতে হবে বা ডিএনএস নিতে হবে। কোনও বিতরণের অফিসিয়াল প্যাকেজ নিতে, আপনি প্যাকেজটি বজায় রাখার জন্য প্রায়শই স্বেচ্ছাসেবক করতে পারেন। সুতরাং আপনি সাধারণভাবে সঠিক হতে পারে এমন সময় এই বিশেষ ক্ষেত্রে আপনার মন্তব্যটি ন্যায়সঙ্গত নয় বলে মনে হয়।
ওলে টাঞ্জ

10
অনুশীলনে আমি জানি না যে পাই পাইড লেখকের অন্তর্গত। বাস্তবে এটি যাচাই করা হচ্ছে, কীভাবে উইজেটে এসএসএল ব্যবহার করা যায় সে সম্পর্কে চিন্তাভাবনা করা এবং এই কমান্ডটি যা করার কথা বলেছে তা করে তা পরীক্ষা করা কিছুটা কাজ। আপনার পয়েন্টটি যে অফিশিয়াল প্যাকেজটিতে দূষিত কোড থাকতে পারে তা সত্য, তবে এটিও উইজেট প্যাকেজটির জন্য রয়েছে।
ফ্যাবিয়ান

3
এটি সর্বোত্তম সমাধান নাও হতে পারে যদি ওপি প্রতিটি আদেশ প্রয়োগ করতে চায় তবে অবশ্যই যথাযথ, সঠিক?
ইকারিয়ানকম্পলেক্স

2
@ ইকারিয়ানকম্পলেক্স যোগ করা -j1 এটি ঠিক করবে।
ওলে টেঞ্জ

26

এটি xargs বা বিড়াল ছাড়া কেবল অন্য একটি পদ্ধতি:

while read stuff; do
  command1 "$stuff"
  command2 "$stuff"
  ...
done < a.txt

2
বগি, দেওয়া আছে। আপনি যদি সাফ না IFSকরেন তবে ফাইল নামগুলিতে শীর্ষস্থানীয় এবং পশ্চাদ্বর্তী স্থানকে এড়িয়ে যাবেন; আপনি যোগ না করা পর্যন্ত -r, আক্ষরিক ব্যাকস্ল্যাশ সহ ফাইলের নামগুলি সেই অক্ষরগুলিকে উপেক্ষা করবে।
চার্লস ডাফি

প্রশ্নের উত্তর দেয় না। এটি সম্পর্কে বিশেষভাবে জিজ্ঞাসা করা হয়েছে xargs। (এই গনুহ অনুরূপ কিছু করতে প্রসারিত কঠিন xargs' -P<n>বিকল্প)
গুহা বার্গ গার্টি ভ্যান

1
এটি পুরোপুরি ভাল কাজ করে। আপনি এটিকে পাইপযুক্ত কমান্ড হিসাবেও ব্যবহার করতে পারেন$ command | while read line; do c1 $line; c2 $line; done
আলেক্সার

25

তুমি ব্যবহার করতে পার

cat file.txt | xargs -i  sh -c 'command {} | command2 {} && command3 {}'

টেক্সট ফাইলের প্রতিটি লাইনের জন্য {} = পরিবর্তনশীল


8
এটি অনিরাপদ। যদি আপনার file.txtস্ট্রিং $(rm -rf ~)হিসাবে একটি ড্যাটুম থাকে?
চার্লস ডাফি

19

আমি যা করি তা হ'ল .brcrc /। প্রোফাইল এ যুক্ত করুন:

function each() {
    while read line; do
        for f in "$@"; do
            $f $line
        done
    done
}

তাহলে আপনি যেমন জিনিস করতে পারেন

... | each command1 command2 "command3 has spaces"

যা xargs বা -exec এর চেয়ে কম ভার্বোজ। আপনি যদি প্রতিটি আচরণের প্রয়োজন হয় তবে কমান্ডের একটি স্বেচ্ছাসেবীয় অবস্থানের পাঠ থেকে মান সন্নিবেশ করতে আপনি ফাংশনটিও সংশোধন করতে পারেন।


1
আন্ডাররেটেড উত্তর, এটি অত্যন্ত সহজ
চার্লসরিড 1

15

আমি শৈলী পছন্দ করি যা শুকনো রান মোড (ছাড়াই | sh) অনুমতি দেয় :

cat a.txt | xargs -I % echo "command1; command2; ... " | sh

পাইপ দিয়েও কাজ করে:

cat a.txt | xargs -I % echo "echo % | cat " | sh

2
এই কাজ, যতক্ষণ না আপনি গনুহ xargs 'ব্যবহার করতে চান -Pবিকল্প ... (যদি না হয়, আমি বেশিরভাগ ব্যবহার -execউপর find, যেহেতু আমার ইনপুট বেশিরভাগই ফাইলের নামের হয়)
গার্টি ভ্যান ডেন বার্গ

13

পার্টিতে একটু দেরি।

আমি স্থানান্তরিত করার আগে হাজার হাজার ক্ষুদ্র ফাইলের সাথে আমার ডিরেক্টরিগুলি সংকোচনের জন্য নীচের ফর্ম্যাটটি ব্যবহার করি। আপনার যদি কমান্ডগুলির মধ্যে একক উদ্ধৃতিগুলির প্রয়োজন না হয় তবে এটি কাজ করা উচিত।

কিছু সংশোধন করে, আমি নিশ্চিত এটি কারও পক্ষে কার্যকর হবে। পরীক্ষিত Cygwin(বাবুন)

find . -maxdepth 1 ! -path . -type d -print0 | xargs -0 -I @@ bash -c '{ tar caf "@@.tar.lzop" "@@" && echo Completed compressing directory "@@" ; }'

find .এখানে সন্ধান করুন
-maxdepth 1শিশু ডিরেক্টরিতে প্রবেশ করবেন না
! -path .বাদ দিন। / বর্তমান ডিরেক্টরি পাথের সাথে
-type dকেবলমাত্র ডিরেক্টরি মেলে ডিরেক্টরিগুলি
-print0নাল বাইট দ্বারা পৃথক আউটপুট \ 0
| xargsপাইপ টু xargs
-0ইনপুট নাল পৃথক বাইট
-I @@প্লেসহোল্ডার = হয় @@ ইনপুট দিয়ে @@ প্রতিস্থাপন করুন।
bash -c '...'বাশ কমান্ড
{...}কমান্ড গ্রুপিং চালান
&&পূর্ববর্তী কমান্ড সফলভাবে উপস্থিত থাকলে কেবল পরবর্তী কমান্ড কার্যকর করুন (প্রস্থান 0)

ফাইনালটি ;গুরুত্বপূর্ণ, অন্যথায় এটি ব্যর্থ হবে।

আউটপুট:

Completed compressing directory ./Directory1 with meta characters in it
Completed compressing directory ./Directory2 with meta characters in it
Completed compressing directory ./Directory3 with meta characters in it

2018 জুলাই আপডেট:

আপনি যদি হ্যাক এবং চারপাশে খেলা পছন্দ করেন তবে এখানে আকর্ষণীয় কিছু:

echo "a b c" > a.txt
echo "123" >> a.txt
echo "###this is a comment" >> a.txt
cat a.txt
myCommandWithDifferentQuotes=$(cat <<'EOF'                                     
echo "command 1: $@"; echo 'will you do the fandango?'; echo "command 2: $@"; echo
EOF
)
< a.txt xargs -I @@ bash -c "$myCommandWithDifferentQuotes" -- @@

আউটপুট:

command 1: a b c
will you do the fandango?
command 2: a b c

command 1: 123
will you do the fandango?
command 2: 123

command 1: ###this is a comment
will you do the fandango?
command 2: ###this is a comment

ব্যাখ্যা:
- একটি একক লাইন স্ক্রিপ্ট তৈরি করুন এবং এটিকে একটি ভেরিয়েবলে সংরক্ষণ করুন
- স্ক্রিপ্ট হিসাবে এটি xargsপড়া a.txtএবং সম্পাদন করে - প্রতিটি বার সম্পূর্ণ লাইনটি পাস করার বিষয়টি নিশ্চিত করে - পরে নিশ্চিত করে নিশ্চিত করা হয় যে পজিশনাল প্যারামিটার ইনপুট হিসাবে কমান্ড হিসাবে নেওয়া হয়েছে , শুরু নয় , অর্থাৎ মত নিজেই যা উপায়েbash
@@
@@--@@bashbashOPTION-crun command

--ঐন্দ্রজালিক, এটা অনেক অন্যান্য জিনিষ, অর্থাত সাথে কাজ করে ssh, এমনকিkubectl


1
আমি এই ধরণের জিনিসটির সাথে একটি সেটআপ ব্যবহার করেছি: find . -type f -print0|xargs -r0 -n1 -P20 bash -c 'f="{}";ls -l "$f"; gzip -9 "$f"; ls -l "$f.gz"'(লুপগুলিতে রূপান্তর করার সময় এটি কিছুটা সহজ)
জের্ট ভ্যান ডান বার্গ

1
আমার পূর্ববর্তী মন্তব্যের জন্য দেরিতে সম্পাদনা: (যদি ফাইলের নামগুলিতে সুরক্ষার সমস্যা থাকে তবে ডাবল উদ্ধৃতিগুলি থাকে ...) (এটি "$@"এড়ানোর একমাত্র উপায় হ'ল ... ( -n1যদি আপনি প্যারামিটারের সংখ্যা সীমাবদ্ধ করতে চান তবে))
গার্ট ভ্যান ডেন বার্গ

এটি লক্ষ্য করা উচিত যে --শেল দ্বারা এটি ব্যবহার করতে ব্যবহৃত হয় যে আর কোনও বিকল্প গ্রহণ করার দরকার নেই। এটি সেখানেও -পরে যাওয়ার সুযোগ দেয় --। উদাহরণস্বরূপ grep -rআপনি যখন প্যাটার্নটি অন্তর্ভুক্ত করবেন না তখন আপনি একটি খুব আকর্ষণীয় এবং বিভ্রান্তিকর আউটপুট পেতে পারেন -! আপনি যেভাবে এটি শব্দটি স্পষ্ট করেন না তা এটি কীভাবে কাজ করে তা প্রকৃতপক্ষে ব্যাখ্যা করে না। প্রথমত এটি একটি পজিক্স জিনিস তবে যাইহোক এটি এটিকে নির্দেশ করা মূল্যবান, আমি মনে করি। কিছু বিবেচনা করার জন্য। এবং আমি যে বোনাস বিটিডব্লু ভালবাসি!
প্রাইফটান

10

এটি সবচেয়ে নিরাপদ সংস্করণ বলে মনে হচ্ছে।

tr '[\n]' '[\0]' < a.txt | xargs -r0 /bin/bash -c 'command1 "$@"; command2 "$@";' ''

( -0মুছে যাবে এবং trএকটি পুনঃচালনা দিয়ে প্রতিস্থাপিত (অথবা ফাইলটি একটি নাল সঙ্গে প্রতিস্থাপিত হতে পারে পরিবর্তে ফাইল পৃথকীকৃত)। এটি সেখানে প্রধানত যেহেতু আমি প্রধানত ব্যবহার xargsসঙ্গে findসঙ্গে -print0আউটপুট) (এটাও প্রাসঙ্গিক হতে পারে xargsছাড়া সংস্করণ -0সম্প্রসারণ)

এটি নিরাপদ, যেহেতু আরোগুলি সম্পাদন করার সময় শেলকে পরামিতিগুলি অ্যারে হিসাবে পাস করবে। শেলটি (কমপক্ষে bash) এরপরে এগুলি একটি অপরিবর্তিত অ্যারে হিসাবে অন্য প্রসেসে প্রেরণ করত যখন সমস্ত ব্যবহার করে প্রাপ্ত হয়["$@"][1]

আপনি যদি ব্যবহার ...| xargs -r0 -I{} bash -c 'f="{}"; command "$f";' ''করেন তবে স্ট্রিংয়ে ডাবল কোট রয়েছে যদি অ্যাসাইনমেন্ট ব্যর্থ হবে। এই ব্যবহার যে বৈকল্পিক জন্য সত্য -iবা -I। (এটি একটি স্ট্রিংয়ে প্রতিস্থাপনের কারণে, আপনি সর্বদা ইনপুট ডেটাতে অপ্রত্যাশিত অক্ষর (যেমন উদ্ধৃতি, ব্যাকটিকস বা ডলার চিহ্ন) সন্নিবেশ করে কমান্ডগুলি ইনজেক্ট করতে পারেন)

যদি আদেশগুলি একবারে কেবলমাত্র একটি প্যারামিটার নিতে পারে:

tr '[\n]' '[\0]' < a.txt | xargs -r0 -n1 /bin/bash -c 'command1 "$@"; command2 "$@";' ''

বা কিছুটা কম প্রক্রিয়া সহ:

tr '[\n]' '[\0]' < a.txt | xargs -r0 /bin/bash -c 'for f in "$@"; do command1 "$f"; command2 "$f"; done;' ''

এক্সটেনশনের xargsসাথে আপনার যদি জিএনইউ বা অন্য থাকে -Pএবং আপনি সমান্তরালভাবে 32 টি প্রক্রিয়া চালাতে চান, প্রতিটি কমান্ডের জন্য 10 টির বেশি নয় তবে প্রতিটি:

tr '[\n]' '[\0]' < a.txt | xargs -r0 -n10 -P32 /bin/bash -c 'command1 "$@"; command2 "$@";' ''

ইনপুটটিতে কোনও বিশেষ অক্ষরের বিপরীতে এটি দৃ rob় হওয়া উচিত। (যদি ইনপুট নাল পৃথক করা হয়।) trকিছু লাইনে নিউলাইন থাকলে সংস্করণটি কিছু অবৈধ ইনপুট পাবে, তবে এটি একটি নিউলাইন পৃথক ফাইলের সাথে অনিবার্য।

প্রথম ফাঁকা প্যারামিটারটি এর bash -cকারণে: ( bashম্যান পেজ থেকে ) (ধন্যবাদ @ ক্ল্যাক)

-c   If the -c option is present, then  commands  are  read  from  the  first  non-option  argument  com
     mand_string.   If there are arguments after the command_string, the first argument is assigned to $0
     and any remaining arguments are assigned to the positional parameters.  The assignment  to  $0  sets
     the name of the shell, which is used in warning and error messages.

ফাইলের নামগুলিতে ডাবল উদ্ধৃতি দিয়েও এটি কাজ করা উচিত। এর জন্য একটি শেল দরকার যা সঠিকভাবে সমর্থন করে"$@"
জার্ট ভ্যান ড্যান বার্গ

আপনি বাশ দেওয়ার জন্য আরগভ [0] টি আর্গুমেন্ট মিস করছেন। bash -c 'command1 "$@"; command2 "$@";' arbitrarytextgoeshere
ক্লেক

3
এটি xargs কি করে তা নয়। bashসঙ্গে -cপ্রথম নেয় (কমান্ডের পরে) একটি আর্গুমেন্ট যে প্রক্রিয়ার নাম হবে, তাহলে এটি অবস্থানগত আর্গুমেন্ট লাগে। চেষ্টা করুন bash -c 'echo "$@" ' 1 2 3 4এবং দেখুন কি আসে।
ক্লেক

সুরক্ষিত সংস্করণটি ববি-সজ্জিত না পেয়ে খুব ভাল।
মতিন উলহাক

8

আর একটি সম্ভাব্য সমাধান যা আমার পক্ষে কাজ করে তা হ'ল এরকম -

cat a.txt | xargs bash -c 'command1 $@; command2 $@' bash

শেষে 'বাশ' নোট করুন - আমি ধরে নিলাম এটি মারতে argv [0] হিসাবে পাস হয়েছে। এই বাক্য বিন্যাসে এটি ছাড়া প্রতিটি কমান্ডের প্রথম প্যারামিটারটি নষ্ট হয়ে যায়। এটি কোনও শব্দ হতে পারে।

উদাহরণ:

cat a.txt | xargs -n 5 bash -c 'echo -n `date +%Y%m%d-%H%M%S:` ; echo " data: " $@; echo "data again: " $@' bash

5
আপনি যদি উদ্ধৃতি না দিয়ে "$@"থাকেন তবে আপনি স্ট্রিং-বিভক্ত হয়ে যুক্তি তালিকার গ্লোব-প্রসারণ করছেন।
চার্লস ডাফি

2

এটির জন্য আমার বর্তমান বিকেএম

... | xargs -n1 -I % perl -e 'system("echo 1 %"); system("echo 2 %");'

এটি দুর্ভাগ্যজনক যে এটি পার্ল ব্যবহার করে, যা ব্যাশের চেয়ে ইনস্টল হওয়ার সম্ভাবনা কম; তবে এটি আরও ইনপুট পরিচালনা করে যা গৃহীত উত্তর। (আমি একটি সর্বব্যাপী সংস্করণকে স্বাগত জানাই যা পার্লের উপর নির্ভর করে না))

@ কিথথম্পসনের পরামর্শ

 ... | xargs -I % sh -c 'command1; command2; ...'

দুর্দান্ত - যদি না আপনার ইনপুটটিতে শেল মন্তব্য অক্ষর না থাকে তবে এই ক্ষেত্রে প্রথম কমান্ডের অংশ এবং দ্বিতীয় কমান্ডের সমস্ত অংশ কেটে যাবে।

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

সমস্যার উদাহরণ:

$ bash 1366 $>  /bin/ls | cat
#Makefile#
#README#
Makefile
README

ওফ, সমস্যাটি এখানে:

$ bash 1367 $>  ls | xargs -n1 -I % sh -i -c 'echo 1 %; echo 2 %'
1
1
1
1 Makefile
2 Makefile
1 README
2 README

আহ, এটি আরও ভাল:

$ bash 1368 $>  ls | xargs -n1 -I % perl -e 'system("echo 1 %"); system("echo 2 %");'
1 #Makefile#
2 #Makefile#
1 #README#
2 #README#
1 Makefile
2 Makefile
1 README
2 README
$ bash 1369 $>  

5
# সমস্যাটি উদ্ধৃতি ব্যবহার করে সহজেই সমাধান করা যেতে পারে:ls | xargs -I % sh -c 'echo 1 "%"; echo 2 "%"'
জিপিএল
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.