2011-05-09 16 views
5

में पहले प्रोग्राम के रिटर्न कोड का उपयोग कैसे करें मैं एक साधारण प्रोग्राम लिख रहा हूं जो एक कंपाइलर से आउटपुट को पार्स करता है और किसी त्रुटि संदेश को दोबारा सुधारता है ताकि आईडीई हम उपयोग कर सकें (विजुअल स्टूडियो) उन्हें पार्स कर सकते हैं । हम nmake का उपयोग निर्माण करने के लिए है, और यह इस तरह एक कमांड लाइन का उपयोग कर संकलक कॉल करेगा:पाइप कमांड लाइन

cc166.exe SOME_FLAGS_HERE MyCFile.c 2>&1 | TaskingVXToVisualReformat.exe 

अब समस्या यह है कि संकलक, cc166 की वापसी कोड, nmake को वापस खिलाया नहीं है। केवल मेरे सुधारक का रिटर्न कोड उपयोग किया जाता है जिसका अर्थ है कि अगर मैं सुधार कार्यक्रम से शून्य लौटाता हूं, तो nmake निरस्त करने के बजाय निर्माण जारी रहेगा। मैं कंपाइलर (cc166.exe) से nmake पर रिटर्न कोड कैसे वापस खिला सकता हूं?

क्या कोई तरीका है कि मेरा सुधार प्रोग्राम कंपाइलर के रिटर्न कोड को पढ़ सकता है और इसका उपयोग अपने रिटर्न कोड का निर्णय लेने पर कर सकता है? सुधारक सी # में लिखा गया है।

उत्तर

0

आप दो में अपने एकल आदेश अलग और एक अस्थायी फ़ाइल में संकलन परिणाम रख सकते हैं:

cc166.exe SOME_FLAGS_HERE MyCFile.c > CCRESULT.TXT 2>&1 
if not errorlevel 1 TaskingVXToVisualReformat.exe < CCRESULT.TXT 
+0

यह प्रश्न का उत्तर नहीं देता है। यदि सीसी 166 सफल होता है, तो ऐसा लगता है कि अंतिम रिटर्न कोड भी एक सफलता है। लेकिन अगर यह विफल हो जाता है, तो सुधारक का रिटर्न कोड अभी भी उपयोग किया जाता है: इसलिए सीसी 166 विफल रहता है और सुधारक "सफलता" की कुल वापसी में उपज प्राप्त करता है (जब यह "असफल" होना चाहिए। इसके अलावा, यह मानता है कि सीसी 166 की एकमात्र विफलता में 1 –

+0

में विंडोज़ शेल रिटर्न कोड 0 में सफलता है, कोई अन्य मूल्य विफलता है। स्थिति "अगर त्रुटि नहीं है 1" वास्तव में सफल होता है तो पहला आदेश वापस लौटाता है। FYI, विंडोज़ में "अगर त्रुटि 1" का अर्थ है "अगर त्रुटि कोड अधिक या बराबर 1 " – SlavaGu

+0

मुझे लगता है कि मैंने समझ लिया है कि आपने अभी तक क्या कहा है, लेकिन क्या होता है यदि सीसी 166 1 (या 2, 3, आदि) लौटाता है और 'टास्किंग VXToVisualReformat.exe' रिटर्न 0? पूरी स्क्रिप्ट वापस नहीं करेगा सफलता, इस तथ्य के बावजूद कि सीसी 166 वास्तव में असफल रहा? –

1

मैं एक bash लिपि में संकलन निर्देश रखा और उसके pipefail सुविधा का इस्तेमाल करते हैं:

पाइपलाइन की निकास स्थिति पाइपलाइन में अंतिम कमांड की निकास स्थिति है, जब तक कि पाइपफ़ाइल विकल्प सक्षम न हो। यदि पाइपफेल सक्षम है, तो पाइपलाइन की वापसी स्थिति गैर-शून्य स्थिति से बाहर निकलने के लिए अंतिम (दाएं) कमांड का मान है, या शून्य अगर सभी आदेश सफलतापूर्वक बाहर निकलते हैं।

की यह एक साधारण परीक्षण के साथ कोशिश करते हैं:

$ cat bash_pipe.sh 
#!/bin/bash 
set -o pipefail 
ls $1 2>&1 | perl -ne '{print;}' 

हम किसी मौजूदा फ़ाइल के साथ इसे चलाते हैं, तो बाहर निकलने के कोड 0 होने जा रहा है (पाइप के माध्यम से पारित):

$ ./bash_pipe.sh bash_pipe.sh 
bash_pipe.sh 
$ echo $? 
0 

./bash_pipe.sh inexistent 
ls: cannot access inexistent: No such file or directory 
echo $? 
2 

तो मैं:

दूसरी तरफ आदेश पर एक गैर-मौजूद फ़ाइल के साथ विफल रहता है n अपने मामले तुम संकलन के निर्देशों की जानकारी

bash -c "compilation_script.sh MyCFile.c" 

नोट

$ cat compilation_script.sh 
#!/bin/bash 
set -o pipefail 
cc166.exe SOME_FLAGS_HERE $1 2>&1 | TaskingVXToVisualReformat.exe 

की तरह एक स्क्रिप्ट में डाल दिया और यह सीधे कॉल (यदि आप कर सकते हैं) या परोक्ष रूप से पूरे करने होंगे: pipefail विकल्प में पेश किया गया था बैश संस्करण 3.

 संबंधित मुद्दे

  • कोई संबंधित समस्या नहीं^_^