ব্যাকগ্রাউন্ড প্রক্রিয়া শেষ না হওয়া পর্যন্ত ফাংশন রিটার্ন কেন করবে না?


21

এই স্ক্রিপ্ট বিবেচনা করুন:

#!/bin/bash
function start {
  leafpad &
  echo $!
}
PID=$(start)
echo "PID is $PID"

লিপপ্যাড প্রক্রিয়া শেষ না হওয়া অবধি স্ক্রিপ্টটি বন্ধ হয়ে যাওয়া বন্ধনীটি পেরিয়ে যায় না, যদিও এটি ব্যাকগ্রাউন্ড প্রক্রিয়া।

কেন? কোনও ফাংশন থেকে পটভূমি প্রক্রিয়া চালু করা কি সম্ভব?

উত্তর:


22

ফাংশনটি ফিরে আসে, তবে কমান্ড প্রতিস্থাপনটি ব্লক করে, কারণ আপনি একটি ব্যাকগ্রাউন্ড জব তৈরি করেছেন, তবে আপনার স্টাডআউট এফডি খোলা আছে। এর >/dev/nullআগে যোগ করে এটি বন্ধ করুন &

#!/bin/bash
function start {
  leafpad >/dev/null &
  echo $!
}
PID=$(start)
echo "PID is $PID"

আপনি যদি চান যে আপনার প্রক্রিয়াটি স্টিডিন, স্টাডআউট, স্টার্ডার বন্ধ থাকে তবে এটি ব্যবহার করুন:

leafpad >/dev/null 0>&1 2>&1 &

এটি স্টিডিন (0), স্টডআউট (1) এবং স্ট্ডার (2), তারপরে পটভূমি (&) বন্ধ করবে। এছাড়াও, এই স্ট্রিম পুনঃনির্দেশগুলি ব্যবহার করার সময় সেগুলি "ধোঁকা" করা ভুলে যাবেন না, এর অর্থ কার্যকর করার ক্রমে সদৃশ।

1>/dev/null 2>&1

এবং

2>&1 1>/dev/null

একই না! পূর্ববর্তী সময়ে, আপনি একটি স্ট্রিমটিকে / dev / নাল (যা আপনি চান) তে নকল করে চলেছেন, পরবর্তীকালে, আপনি স্টাডারের প্রতি / dev / stdout ডুপ্লিকেট করছেন এবং তারপরে স্টডআউট বন্ধ করছেন। সুতরাং প্রেরিত কোনও বার্তা stderrআপনার কনসোলে উপস্থিত হবে।


আমার সিস্টেমে নিশ্চিত করা হয়েছে
user120161

10
আপনি স্ট্রিমগুলি বন্ধ করছেন না, আপনি সেগুলি পুনর্নির্দেশ করছেন।
dcat

4
কাছে; ফাইল বিবরণকারী n>&-যেখানে n
dcat

1
@ ডিকাট: হ্যাঁ, তবে /dev/nullকোনও প্রক্রিয়া তার স্টাডআউট লেখার চেষ্টা করলে / থেকে পুনঃনির্দেশ আই / ও ত্রুটির দিকে পরিচালিত করে না, তবে 1এটি একটি অবৈধ এফডি হিসাবে আবিষ্কার করে। সুতরাং পোস্টের পরিভাষাটি ভুল, আসল বাশ প্রোগ্রামিং নয়। (আসলে, 0 বিত্ত এফডি 1 অনুরূপ যে stdin একটি ফাইল-বর্ণনাকারী দিয়ে খোলা হতে হবে O_RDONLYযেমন, যখন প্রক্রিয়া চেষ্টা পড়তে সম্ভবত একটি ত্রুটি (বদলে কাঙ্ক্ষিত নো বাইট-উপলব্ধ) দিতে হবে।) wc >/dev/null 0>&1> -wc: standard input: Bad file descriptor
পিটার কর্ডস

1
@ পিটারকর্ডস - পুরাতন বর্ণনাকারীটি বন্ধ করে নতুনটিকে পুনর্নির্দেশের জন্য পারস্পরিক একচেটিয়া হওয়ার দরকার নেই। exec <&- >&- <>/dev/null >&0স্ট্যান্ডিন / আউট বেশ সুন্দরভাবে পরিচালনা করে। এটি zshকমপক্ষে একটি পার্থক্য তৈরি করে যা মাল্টোস সেট হয়ে গেলে স্বয়ংক্রিয়ভাবে একই বর্ণনাকারীর উপর সমস্ত খোলার চেষ্টা করে।
মাইক্রজারভ
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.