"वैरिएबल करें" एम्परसेंड (एक प्रक्रिया पृष्ठभूमि)


9

अगर वहाँ एक चर में ampersand डाल करने के लिए एक रास्ता है और अभी भी पृष्ठभूमि के लिए एक प्रक्रिया भेजने के लिए इसका इस्तेमाल करने के लिए मैं जानना चाहता हूँ।

यह काम:

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

लेकिन यह केवल एक के साथ उन पांच लाइनों को पूरा करने के लिए अच्छा नहीं होगा? इस तरह:

BCKGRND='&'
sleep 5 ${BCKGRND}

लेकिन वह काम नहीं करता है। यदि BCKGRND सेट नहीं है तो यह काम करता है - लेकिन जब यह सेट होता है तो इसे एक शाब्दिक 'और' के रूप में व्याख्या की जाती है।


अनुगामी ampersand का उपयोग करने के बाद, echo $!PID
noobninja

जवाबों:


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 @StephenKitt; अब गियर बदल रहे हैं
जेफ स्कालर

मुझे इसकी सादगी के लिए स्पष्ट उत्तर पसंद आया लेकिन मेरी वास्तविक वास्तविक विश्व कमान जिसे मैं पृष्ठभूमि में लाना चाहता था, वह अभी तक बहुत सारे चरों के साथ बहुत जटिल थी जो कि eval का उपयोग करने में सहज थी। @ jeff-schaller ने जो जवाब दिया, वह मुझे उस दिशा में इशारा करता है जो मैं गया था। एक फ़ंक्शन के बजाय, हालांकि, मैंने पूरी कमांड को एक चर में डाल दिया, फिर उसकी इफ़ेक्ट शैली का उपयोग कमांड के साथ या उसके बिना निष्पादित करने के लिए किया।
ब्राउनकोटाओकी

11

आप चीजों को फ्लिप कर सकते हैं और "अग्रभूमि" को चर सकते हैं:

FOREGROUND=fg
sleep 5 & ${FOREGROUND}

सेट FOREGROUNDकरने के लिए trueया पृष्ठभूमि में प्रक्रिया चलाने के लिए खाली। ( बैकग्राउंड में चलाने के FOREGROUNDलिए सेटिंग करना trueभ्रामक है। उपयुक्त चर नाम पाठक के लिए एक अभ्यास के रूप में छोड़ दिए जाते हैं।)


4
यह अच्छा है, लेकिन यह नौकरी के नियंत्रण के बिना एक शेल में काम नहीं करेगा (जब तक कि किसी भी स्क्रिप्ट set -mका उपयोग नहीं किया गया था)।
मॉसवी

9

आपको शायद उपयोग करना होगा eval:

eval "sleep 5" "$BCKGRND"

evalदिए गए तर्कों का पुनर्मूल्यांकन करने के लिए शेल का कारण बनता है। &इसलिए शाब्दिक रूप &से एक कमांड के अंत में व्याख्या की जाएगी और कमांड में एक तर्क के रूप में नहीं, कमांड को पृष्ठभूमि में रखा जाएगा।


2
युक्त उत्तर evalमें एक चेतावनी होनी चाहिए, कि यह देखभाल के साथ हैंडल होना चाहिए। उदाहरण देखें यह उत्तर
राल्फ

मुझे "$BCKGRND"खाली तर्क के मूल्यांकन में समस्या नहीं है ।
मूस

2
@ राल्फ इस मामले में बिल्कुल अप्रासंगिक है । उदाहरण के लिए कुछ खास नहीं है - आप उदाहरण के लिए अंकगणितीय विस्तार के माध्यम से कमांड निष्पादित कर सकते हैं। हो सकता है कि वहाँ सब ;-) पर बैश (या किसी भी इसी तरह खोल) का उपयोग कर के खिलाफ इस तरह के एक चेतावनी होना चाहिए
mosvy

1
@ कुसलानंद evalवास्तविक निष्कासन करने से पहले रिक्त स्थान के साथ अपने तर्कों में शामिल हो जाएंगे। बस इसे आज़माएँ eval printf "'{%s}\n'" foo "" "" "":। eval foo "" "" "" ""पूरी तरह से समान है eval foo, चाहे कोई भी चीज हो IFSया अन्य चीज।
मॉसवी

1
यदि यह कोई विशेष वर्ण है, उदाहरण के लिए eval'ed का कमांड डबल कोट्स में होना चाहिए eval 'sleep $TIMEOUT' "$BACKGROUND"। अन्यथा आप डबल विस्तार प्राप्त कर सकते हैं यदि चर दूसरे चर में फैलता है या इसमें विशेष वर्ण होते हैं। इसके अलावा, नेस्टेड उद्धृत मुश्किल हो सकता है।
बरमार
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.