এম্পারস্যান্ডকে "বৈকল্পিক করুন" (ব্যাকগ্রাউন্ড একটি প্রক্রিয়া)


9

আমি জানতে চাই যে অ্যাম্পারস্যান্ডকে একটি ভেরিয়েবলের মধ্যে রাখার কোনও উপায় আছে এবং এখনও কোনও প্রক্রিয়াকে ব্যাকগ্রাউন্ডে প্রেরণ করতে এটি ব্যবহার করুন।

এইটা কাজ করে:

BCKGRND=yes
if [ "$BCKGRND" = "yes" ]; then
    sleep 5 &
else
    sleep 5
fi

তবে কেবল একটি দিয়ে এই পাঁচটি লাইনটি সম্পাদন করা কি শীতল হবে না? তাই ভালো:

BCKGRND='&'
sleep 5 ${BCKGRND}

কিন্তু এটি কাজ করে না। বিসিকেজিআরএনডি সেট না করা থাকলে এটি কাজ করে - তবে এটি সেট হয়ে গেলে এটিকে আক্ষরিক '&' হিসাবে ব্যাখ্যা করা হয় এবং ত্রুটিগুলি আউট হয়।


উত্তর:


9

কলের ব্যাকগ্রাউন্ডে কোনও ভেরিয়েবল ব্যবহার করা সম্ভব নয় কারণ কন্ট্রোল অপারেটরদের (যেমন &&এবং &) কমান্ড-লাইনটি পার্স করার পরে পরিবর্তনশীল প্রসার ঘটে ।

তবুও অন্য বিকল্পটি হ'ল কলগুলিকে কোনও ফাংশনে মোড়ানো:

mayberunbg() {
  if [ "$BCKGRND" = "yes" ]; then
    "$@" &
  else
    "$@"
  fi
}

... এবং তারপরে প্রয়োজনীয় হিসাবে চলক সেট করুন:

$ BCKGRND=yes mayberunbg sleep 3
[1] 14137
$
[1]+  Done                    "$@"
# or
$ BCKGRND=yes
$ mayberunbg sleep 3
[1] 14203
$
[1]+  Done                    "$@"
$ BCKGRND=no mayberunbg sleep 3
# 3 seconds later
$

কি, না ed? যাইহোক +1, এটি সবচেয়ে পরিষ্কার সমাধান।
স্টিফেন কিট

LOL @ স্টেফেনকিট; এখন গিয়ারগুলি ঘুরছে
জেফ শ্যাচলার

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

11

আপনি জিনিসগুলি উল্টাতে এবং "অগ্রভাগ" পরিবর্তন করতে পারেন:

FOREGROUND=fg
sleep 5 & ${FOREGROUND}

ব্যাকগ্রাউন্ডে প্রক্রিয়াটি চালাতে সেট FOREGROUNDকরুন trueবা খালি করুন। (সেটিং FOREGROUNDকরার trueপটভূমি চালানোর জন্য বোঝা যাচ্ছে যে নেতারা বিভ্রান্তিকর হয়! যথাযথ পরিবর্তনশীল নামের পাঠকদের জন্য একটি ব্যায়াম যেমন ফেলে রাখা হয়।)


4
এটি দুর্দান্ত তবে এটি কাজ নিয়ন্ত্রণ ব্যতীত শেলটিতে কাজ করবে না (অর্থাত্ কোনও স্ক্রিপ্ট set -mব্যবহার না করা)।
মশবির

9

আপনি সম্ভবত ব্যবহার করতে হবে eval:

eval "sleep 5" "$BCKGRND"

evalপ্রদত্ত আর্গুমেন্টগুলির পুনরায় মূল্যায়ন করার জন্য শেলটি সৃষ্টি করে। আক্ষরিক অর্থে একটি কমান্ডের শেষে এবং কমান্ডটিকে পটভূমিতে রেখে কমান্ডের যুক্তি হিসাবে &ব্যাখ্যা করা হবে &


2
যুক্ত উত্তরে evalএকটি সতর্কতা থাকা উচিত, এটি যত্ন সহকারে পরিচালনা করা উচিত। দেখুন এই উত্তর
রাল্ফ

"$BCKGRND"খালি যুক্তির মূল্যায়ন করতে সমস্যা কী তা আমি পাই না ।
মশবী

2
@ র‌্যালফ এই ক্ষেত্রে একেবারেই অপ্রাসঙ্গিক । ইভাল সম্পর্কে বিশেষ কিছু নেই - উদাহরণস্বরূপ, আপনি পাটিগণিতের বিস্তারের মাধ্যমে আদেশগুলি কার্যকর করতে পারেন। সম্ভবত ব্যাশ (বা অন্য কোনও অনুরূপ শেল) ব্যবহার করার বিরুদ্ধে এই জাতীয় কোনও সতর্কতা থাকতে হবে ;-)
মস্কি

1
@ কুসালানন্দ evalপ্রকৃত প্রমাণ দেওয়ার আগে ফাঁকা জায়গাগুলির সাথে তার যুক্তিগুলিতে যোগদান করবে। এটা চেষ্টা করুন: eval printf "'{%s}\n'" foo "" "" ""। যাই হোক না কেন বা অন্য জিনিস যাই হোক না কেন eval foo "" "" "" ""এটি সম্পূর্ণরূপে সমান । eval fooIFS
ম্যাসভি 15

1
যে কমান্ডটি খণ্ডন করা হচ্ছে তা ডাবল উক্তিতে থাকা উচিত যদি এতে কোনও বিশেষ অক্ষর থাকে, যেমন eval 'sleep $TIMEOUT' "$BACKGROUND"। অন্যথায় আপনি যদি ভেরিয়েবলটি অন্য চলকটিতে প্রসারিত হয় বা বিশেষ অক্ষর থাকে তবে আপনি দ্বিগুণ প্রসার লাভ করতে পারেন। এছাড়াও, নেস্টেড উদ্ধৃতিগুলি জটিল হয়ে উঠতে পারে।
বারমার
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.