আমি কীভাবে একক লাইনে একাধিক পটভূমি কমান্ড চালাতে পারি?


169

আমি সাধারণত এরকম কিছু দিয়ে একাধিক কমান্ড পরিচালনা করি:

sleep 2 && sleep 3

অথবা

sleep 2 ; sleep 3

তবে আমি যদি উভয়কে একটি কমান্ড লাইন কমান্ডের পটভূমিতে চালাতে চাই?

sleep 2 & && sleep 3 &

কাজ করে না এবং উভয়ই প্রতিস্থাপন &&করে না;

এটি করার কোন উপায় আছে?


8
()কমান্ডটি চারপাশে ব্যবহার করুন ।
নাহধঃ

উত্তর:


318

ঠিক কীভাবে আপনি তাদের চালাতে চান? আপনি যদি সেগুলি পটভূমিতে শুরু করতে এবং ক্রমানুসারে চালিত করতে চান তবে আপনি এই জাতীয় কিছু করবেন:

(sleep 2; sleep 3) &

অন্যদিকে, আপনি যদি তাদের পটভূমিতে সমান্তরালভাবে চলতে চান তবে আপনি পরিবর্তে এটি করতে পারেন:

sleep 2 & sleep 3 &

এবং দুটি কৌশল একত্রিত হতে পারে, যেমন:

(sleep 2; echo first finished) & (sleep 3; echo second finished) &

বাশকে বাশ দেওয়া হচ্ছে, একই কাজটি সম্পাদন করতে প্রায়শই বিভিন্ন কৌশল রয়েছে, যদিও মাঝে মাঝে তাদের মধ্যে সূক্ষ্ম পার্থক্য রয়েছে।


20
এটি একটি সংক্ষিপ্ত, সুচিন্তিত উত্তর যা জীবনের জন্য "একজন মানুষকে মাছ শেখায়"। ধন্যবাদ।
ambrus

2
আমরা কি করলে কি হয় sleep 2 && sleep 3 &? আমি এটি ব্যাশে চেষ্টা করেছি এবং মনে হয় এটি একইভাবে কাজ করে (প্রতিধ্বনি দিয়ে চেষ্টা করেছে)।
ওয়াজাহাট

@ হাকানবাবা, হ্যাঁ এটি সত্যই পটভূমিতে একটি সাবসেল তৈরি করে।
ডুউ ভ্যান ডের লেস্ট

3
@ ওয়াজাহাট, আপনি চেষ্টা করেছেন sleep 2 && echo "foo" && sleep 3 & echo "bar""? &&অপারেটর এটা আগে কমান্ড চালানো শেল বলে, এবং কেবল যদি কোনো ত্রুটি ছাড়া যে বিধান শেল পরবর্তী কমান্ড সঞ্চালন করে। এটি মূলত এর থেকে আলাদা ;, কারণ ;পূর্ববর্তী কমান্ডের প্রস্থান স্থিতি ছাড়াই পরবর্তী কমান্ডটি কার্যকর করতে দেয় যদি না এটি মারাত্বক ত্রুটি হয়। &"Connected" কম্যান্ডের সব পূর্ববর্তী চালানো পটভূমিতে শেল বলে। "সংযুক্ত" এখানে অর্থ কমান্ডটি একটি পাইপের ( |) বা লজিকাল অপারেটরের অংশ।
ডুউ ভ্যান ডের লেস্ট

Of these list operators, ‘&&’ and ‘||’ have equal precedence, followed by ‘;’ and ‘&’, which have equal precedence.বাশ ম্যানুয়াল।
জিনবিওম হং

49

আপনার শেষ সংস্করণে আপনাকে কিছু পেরেন যুক্ত করতে হবে -

(sleep 2 &) && (sleep 3 &)

অথবা এটিও কাজ করে -

(sleep 2 &) ; (sleep 3 &)

দ্রষ্টব্য: যখন একটি তালিকা ব্যবহার করা হয় তখন &এর প্রস্থান স্থিতি সর্বদা শূন্য থাকে। সুতরাং, উপরোক্ত দুটি কেস একই কাজ করে (শেলটি উভয় পক্ষকে অবিচ্ছিন্নভাবে কার্যকর করে )।
জিনবিওম হং

9

একাধিক পটভূমি কমান্ড চালানোর জন্য আপনাকে &প্রতিটি কমান্ডের শেষ যোগ করতে হবে । উদা: (command1 &) && (command2 &) && (command3 &)


5

উপরের উত্তরগুলি প্রথম বন্ধনী ব্যবহার করে। বাশ একই ধরণের উদ্দেশ্যে ব্রেস ব্যবহার করতে পারে:

{ sleep 2 && sleep 3; } &

লক্ষণীয় যে ব্রেসগুলি সিনট্যাক্স সম্পর্কে আরও বাছাইযোগ্য - স্থান পরে {, স্থান আগে }এবং চূড়ান্ত সেমিকোলন প্রয়োজন। কিছু পরিস্থিতিতে ধনুর্বন্ধনীগুলি আরও কার্যকর কারণ তারা একটি নতুন সাবশেল কাঁটাচামচ করে না। এই ক্ষেত্রে আমি জানি না যে এটি কোনও পার্থক্য করে কিনা।


1
কি হবে { sleep 2; sleep 3; } &?
কেনি এভিট

4

এইটা কাজ করে:

$(sleep 2 &) && sleep 3 &

এছাড়াও আপনি করতে পারেন:

$(sleep 2 && sleep 3) &

0

আমারও একই মিশন আছে। আমি চেষ্টা করেছি (sleep2 ; fg )& sleep3 ; fg, এটা কাজ করছে এবং যখন আপনি সিআরটিএল + সি দ্বিগুণ করেন তখন দুটি প্রক্রিয়া বন্ধ হয়ে যায় be


0

আপনি এইভাবে ব্যাশ কমান্ড বিকল্প ব্যবহার করতে পারেন $(command):

$(command1 ; command2) &

নোট করুন যে স্টিডিন এবং স্টডআউট এখনও পিতামাতার প্রক্রিয়ার সাথে যুক্ত এবং কমপক্ষে স্টাডআউট পুনর্নির্দেশ করা জটিল হতে পারে। সুতরাং বিকল্পভাবে আপনি একক লাইনে কমান্ডগুলি শৃঙ্খলে রাখতে পারেন তারপরে স্ট্রিংটি bashকমান্ডের সাথে একটি নতুন প্রক্রিয়া সঞ্চার করতে পারেন যা এক্সিকিউশনটি পরিচালনা করবে।

bash -c "command1 ; command2" & 

আপনার পটভূমিতে একাধিক কমান্ড চালানোর প্রয়োজন হলে এটি ব্যাশ স্ক্রিপ্টে বিশেষত কার্যকর।

এই দুটি বিবৃতি সমতুল্য হওয়া উচিত। একটি ব্যাশ প্রক্রিয়া উভয় ক্ষেত্রেই ডিম হয় কমান্ড (কমান্ড চেইন অব) এবং পরিচালনা করতে& হয় এবং শেষে কার্য সম্পাদনকে বিচ্ছিন্ন করে।

এই সময় আপনি যোগ করতে পারেন &>/dev/nullআগে &অন্তত stdout- এ সময়ে পুনর্নির্দেশ করতে কমান্ডের শেষে এবং পিতা বা মাতা প্রক্রিয়ার stdout- এ আউটপুট এড়ানো। কিছুটা এইরকম:

bash -c "command1 ; command2" &>/dev/null &

-1

আপনি যদি একাধিক কমান্ড ক্রমান্বয়ে চালাতে চান তবে একটি খুব সহজ পদ্ধতি রয়েছে যা সর্বত্র কাজ করে: একটি ফাইল তৈরি করা! এই পদ্ধতির সুবিধাটি হ'ল এটি পরিষ্কার এবং সহজ।

প্রথমে আপনার নামটি দিয়ে একটি ফাইল তৈরি করুন commands.sh। তারপরে, আপনার আদেশগুলি সেখানে রাখুন। এখানে একটি নমুনা দেওয়া হল:

commands.sh:

#!/system/bin/sh

sleep 3;
sleep 2;

ঠিক আছে, এখন আমরা শেষ ধাপে আছি। পটভূমিতে কমান্ড চালাতে (ধারাবাহিকভাবে), কেবল চালান:

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