sh

2013-01-17 45 views
7

में eval कमांड के लिए निकास कोड प्राप्त करें मैं एक शेल स्क्रिप्ट में एक फ़ंक्शन बनाने की कोशिश कर रहा हूं जो कमांड लेता है और इसे eval का उपयोग करके निष्पादित करता है, और उसके बाद आदेश की सफलता के आधार पर कुछ पोस्ट-प्रोसेसिंग करता है। दुर्भाग्यवश कोड व्यवहार नहीं कर रहा है जैसा कि मैं उम्मीद करता हूं। यहाँ मैं क्या है:sh

#!/bin/sh 

... 

function run_cmd() 
{ 
     # $1 = build cmd 

     typeset cmd="$1" 
     typeset ret_code 

     eval $cmd 
     ret_code=$? 

     if [ $ret_code == 0 ] 
     then 
       # Process Success 
     else 
       # Process Failure 
     fi 

} 

run_cmd "xcodebuild -target \"blah\" -configuration Debug" 

जब आदेश ($cmd) सफल होता है, यह ठीक काम करता है। जब आदेश विफल रहता है (उदाहरण के लिए संकलन त्रुटि), विफलता को संसाधित करने से पहले स्क्रिप्ट स्वचालित रूप से बाहर निकलती है। क्या कोई रास्ता है जिससे मैं बाहर निकलने से बच सकता हूं, या क्या कोई अलग दृष्टिकोण है जो मुझे ले सकता है जिससे मुझे वांछित व्यवहार प्राप्त हो सके?

+2

तब तक कोई स्वचालित निकास नहीं होना चाहिए जब तक कि आप अपनी स्क्रिप्ट में कहीं भी सेट-सेट नहीं करते। यदि आपके पास है, तो 'सेट + ई' इसे अक्षम कर देगा। –

+0

* श्वास * मैंने कॉलर स्क्रिप्ट के शीर्ष पर 'set -o errexit' lingering किया था। यह बात बताने के लिए धन्यवाद। – Jeff

उत्तर

13

स्क्रिप्ट में केवल set -e है, तो स्क्रिप्ट केवल बाहर निकलना चाहिए, इसलिए मुझे लगता है कि यह मामला है।

run_cmd() { 
     if eval "[email protected]"; then 
       # Process Success 
     else 
       # Process Failure 
     fi 
} 

ध्यान दें कि function गैर पोर्टेबल है जब समारोह को परिभाषित करने, और अनावश्यक अगर () भी उपयोग किया जाता है: एक आसान तरीका समारोह जो एक स्वत: बाहर निकलने के आरंभ होने से set -e पाएगा लिखने के लिए करना है।