2009-11-11 23 views
10

में कमांड का निर्माण करना मैं गतिशील रूप से बैश में एक कमांड बना रहा हूं। यह ठीक काम करता है:गतिशील रूप से बैश

COMMAND="java myclass" 
${COMMAND} 

अब मैं गतिशील रूप से एक आदेश है कि उत्पादन redirectes का निर्माण करना चाहते हैं:

LOG=">> myfile.log 2>&1" 
COMMAND="java myclass $LOG" 
${COMMAND} 

आदेश अभी भी जावा प्रक्रिया का आह्वान है, लेकिन उत्पादन

myfile.log पर पुनः निर्देशित नहीं कर रहा है

साथ ही, यदि मैं करता हूँ:

BACKGROUND="&" 
COMMAND="java myclass $BACKGROUND" 
${COMMAND} 

आदेश टी में नहीं चला जाता है वह पृष्ठभूमि।

लॉग रीडायरेक्ट कैसे प्राप्त करें, और पृष्ठभूमि बिट्स कैसे काम कर रहे हैं इस पर कोई संकेत है? (बैश -x से पता चलता आदेशों की उम्मीद के रूप में निर्माण किया जा रहा)

(वास्तविकता में, इस उदाहरण के विपरीत, लॉग और पृष्ठभूमि का मान डायनामिक सेट कर रहे हैं)

उत्तर

4

क्योंकि उद्धरण के विशेष अर्थ को निष्क्रिय यह काम नहीं करता है > और &। आपको शेल की इन विशेषताओं को लागू करने वाले आदेशों को निष्पादित करना होगा।

रीडायरेक्ट करने के लिए, उस आदेश से पहले exec >> myfile.log 2>&1 पर कॉल करें जिसे आप लॉग करना चाहते हैं।

पृष्ठभूमि में एक प्रोग्राम चलाने के लिए, nohup (nohup cmd args...) का उपयोग करें।

+0

स्पष्टीकरण के लिए धन्यवाद। – Joel

12

आप eval आदेश के साथ कर सकता है:

eval ${COMMAND} 
+4

सावधान रहें कि कमांड के पैरामीटर उद्धरण की आवश्यकता होने पर 'eval' तोड़ सकता है। –

+0

मैं इस जवाब का उपयोग कर समाप्त हुआ - हालांकि मैंने एरन्स को सही के रूप में चिह्नित किया क्योंकि यह थोड़ा और पूरा था ... इच्छा है कि मैं उन्हें दोनों सही तरीके से चिह्नित कर सकूं। – Joel

12

eval आप क्या चाहते हैं नहीं करता है।

#!/bin/bash 

CMD="echo foo" 
OUT="> foo.log" 
eval ${CMD} ${OUT} 


CMD="sleep 5" 
BG="&" 
eval ${CMD} ${BG} 
संबंधित मुद्दे