2010-08-28 10 views
8

में फ़ाइल से निष्पादन लाइन मैं एक पाठ फ़ाइल से कमांड पढ़ने और बैश स्क्रिप्ट से प्रत्येक पंक्ति निष्पादित करने की कोशिश कर रहा हूं।बैश

#!/bin/bash 
while read line; do 
    $line 
done < "commands.txt" 

कुछ मामलों में, यदि $line आदेशों पृष्ठभूमि में चलाने के लिए होती हैं कि, जैसे शामिल command 2>&1 & वे पृष्ठभूमि में शुरू नहीं होगा, और वर्तमान स्क्रिप्ट संदर्भ में चलेंगे।

कोई विचारधारा क्यों?

+3

क्या कोई कारण है कि आप अपना खुद का लूप लिखने के बजाय "स्रोत कमांड.txt" नहीं कर सकते हैं? –

+0

"स्रोत" क्या करता है? मैं परीक्षण करने के लिए अब यह – Quamis

+0

कृपया कोशिश कर रहा हूँ [BashFAQ/050] (http://mywiki.wooledge.org/BashFAQ/050)। और फिर जिम लुईस के सुझाव के रूप में 'स्रोत' (या '.') का उपयोग करें। आपके स्रोत में पहली वाक्य क्या कहती है, 'स्रोत' बहुत कुछ करता है। –

उत्तर

7

यदि आपके सभी आदेश "command.txt" के अंदर हैं, तो अनिवार्य रूप से, आप इसे एक शेल स्क्रिप्ट कह सकते हैं। यही कारण है कि आप या तो इसे स्रोत कर सकते हैं, या इसे सामान्य की तरह चला सकते हैं, यानी chmod u + x, तो आप इसे sh commands.txt

1

का उपयोग करके निष्पादित कर सकते हैं मेरे पास ghostdog74 के उत्तर को सही तरीके से जोड़ने के लिए कुछ भी नहीं है, लेकिन मैं कवर कर रहा हूं कि यह क्यों विफल हो रहा है: शैल पारदर्शी विस्तार से पहले I/O पुनर्निर्देशन, पृष्ठभूमि और अन्य चीजों का एक गुच्छा पार्स करता है, इसलिए $line को command 2>&1 & द्वारा प्रतिस्थापित किया गया है 2>&1 और & को अन्य किसी भी चीज़ के रूप में पहचानने में बहुत देर हो चुकी है command पर पैरामीटर से।

आप eval "$line" का उपयोग करके यह सुधार सकता है लेकिन फिर भी वहाँ आप बहु आदेशों के साथ समस्याओं (जैसे while लूप में, अगर ब्लॉक, आदि) में चलाने की जाती है। source और sh दृष्टिकोण इस समस्या नहीं है।