ব্যাকগ্রাউন্ডে একই কমান্ডটি একাধিকবার চালান


14

একাধিক কমান্ড চালানো এবং বাশ ব্যবহার করে তাদের পটভূমি কীভাবে সম্ভব?

উদাহরণ স্বরূপ:

$ for i in {1..10}; do wait file$i &; done

যেখানে অপেক্ষা একটি কাস্টম বাইনারি হয়।

এখনই আমি একটি ত্রুটি পেয়েছি:

syntax error near unexpected token `;'

উপরের কমান্ড চলমান যখন।

ব্যাকগ্রাউন্ড হয়ে গেলে কমান্ডগুলি সমান্তরালে চলতে হবে।


1
আপনার উল্লেখ না করাকে আকৃষ্ট করছি: nohupপটভূমিতে আপনাকে একটি কমান্ড চালানোর অনুমতি দিচ্ছে
ডেভ হ্যামিল্টন

3
ত্রুটি তুমি চক্ষুষ্মান কারণে &এবং ;উভয় "কমান্ড terminators" হয়। আপনার দুটোই ব্যবহার করার দরকার নেই: for ...; do wait $arg & doneকাজ করবে।
গ্লেন জ্যাকম্যান

@ বাগেন জ্যাকম্যান হ্যাঁ, আমি আসলে প্রশ্ন পোস্ট করার পরে এটি চেষ্টা করেছিলাম। উভয়ের প্রয়োজন নেই; এবং &
সেবি

3
ভবিষ্যতের পাঠকদের জন্য ডকুমেন্টেশনের লিঙ্ক : "একটি তালিকা অপারেটরগুলির মধ্যে একটি দ্বারা পৃথক করা এক বা একাধিক পাইপলাইনের ক্রম যা ';', '&', '&&', বা '||', এবং বিকল্পভাবে এক দ্বারা সমাপ্ত করা হয় এর ';', '&', বা একটি নতুন লাইন। (জোর দেওয়া খনি)
গ্লেন জ্যাকম্যান

উত্তর:


21

&, ঠিক ;একটি হল তালিকা টারমিনেটর অপারেটর। তাদের একই বাক্য গঠন রয়েছে এবং বিনিময়যোগ্যভাবে ব্যবহার করা যেতে পারে (আপনি যা করতে চান তার উপর নির্ভর করে)। এর অর্থ হল যে আপনি যা চান তা বা command1 &; command2প্রয়োজন হয় না command1 & command2

সুতরাং, আপনার উদাহরণে, আপনি কেবল লিখতে পারেন:

for i in {1..10}; do wait file$i & done

এবং প্রতিটি waitকমান্ড পটভূমিতে আরম্ভ হবে এবং লুপটি অবিলম্বে পরবর্তীটিতে চলে যাবে।


4

সামঞ্জস্যের স্বার্থে প্রসারণের পরিবর্তে পিক্সিক ফর্মটি ব্যবহার করুন:

for i in $(seq 1 10); do (./wait file$i &); done

1
নোট করুন যে seqকোনও পসিক্স কমান্ড নয় এবং সাধারণত জিএনইউ সিস্টেমে পাওয়া যায়। আচরণ বা $(...)(এবং $i) এর বর্তমান মানের উপর নির্ভর করে $IFS। আরও মনে রাখবেন যে এটি করে (cmd &), cmdএকটি সাব-শেলের সন্তান হবে, সুতরাং আপনি উদাহরণস্বরূপ এর প্রস্থান স্থিতির জন্য অপেক্ষা করতে পারবেন না।
স্টাফেন চেজেলাস

2

আপনি আদেশগুলি দলবদ্ধ করতে পারেন এবং গোষ্ঠীভুক্ত কমান্ডগুলিকে পটভূমিতে রাখতে পারেন। পছন্দ:

$ for i in {1..10}; do ((wait file$i)&); done

সেখানে ভেতরের প্রথম বন্ধনী ব্যবহার করতে কোন প্রয়োজন নেই ...
মার্ক

যদি আপনি প্রশ্নে জিজ্ঞাসা করা হয়েছে ব্যাকগ্রাউন্ডে একাধিক কমান্ড রাখতে চান তবে কেবলমাত্র অভ্যন্তরীণ বন্ধনী ব্যবহার করা দরকার। যেমন ((ঘুম 1; অপেক্ষা ফাইল $ i) &);
mazs 23'16

2

আপনার বাইনারি আসলেই নামকরণ করা হয় wait? আমি এটি করার পরামর্শ দিচ্ছি না, কারণ waitএটি শেল অন্তর্নির্মিত।

আমি বিশ্বাস করি যে বাশ ব্যাকগ্রাউন্ড প্রক্রিয়াগুলি প্রবর্তন করে এমন এক-লাইন লুপকে ভালভাবে পার্স করতে পারে না। আমি আপনাকে কোডটি এতে পরিবর্তন করার পরামর্শ দিচ্ছি:

$ for i in {1..10}; do ./wait file$i & echo "Running 'wait' using PID=$!..."; done
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.