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


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.