2011-05-09 9 views
5

Çıktıları bir derleyiciden ayrıştıran ve hata iletilerini yeniden biçimlendiren basit bir program yazıyorum. Böylece kullandığımız IDE (görsel stüdyo) bunları ayrıştırabilir . Biz inşa etmek nmake kullanın ve böyle bir komut satırı kullanarak derleyici arayacak: Bir boru komut satırındaki ilk programın dönüş kodu nasıl kullanılır

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

Şimdi problem derleyicisi, cc166 dönüş kodu, nmake geri beslenen olmamasıdır. Reform programımın sadece geri dönüş kodu kullanılır, bu da eğer reforme programından sıfıra geri dönersem, nmake iptal etmek yerine inşaata devam eder. Geri dönüş kodunu derleyiciden ( cc166.exe) nmake'a nasıl geri gönderebilirim?

Yeniden biçimlendirme programımın derleyicinin dönüş kodunu okuyabileceği ve kendi dönüş kodunu belirlerken kullanabileceği bir yol var mı? Yeniden biçimlendirici C# ile yazılmıştır.

cevap

0

İkide içine tek bir komutu ayırmak ve geçici bir dosyada derleme sonuçlarını tutabilir: Bir bash komut derleme talimatlarını koyardı

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

Bu soruya cevap vermiyor. Cc166 başarılı olursa, o zaman son dönüş kodu da bir başarı gibi görünüyor. Fakat eğer başarısız olursa, o zaman reformcunun geri dönüş kodu hala kullanılır: cc166 başarısız olur ve reformcu, toplamda “başarı” nın geri dönüşü (“başarısızlık” durumunda getiri elde eder. Ayrıca, cc166'nın tek başarısızlığının, geri dönüş 1. –

+0

Windows kabuk dönüş kodu 0, başarı, diğer herhangi bir değer hatasıdır. "Hata 1" değilse, ilk komut 0 döndürülürse "aslında başarılı olur." FYI, Windows'ta "errorlevel 1", "hata kodu ise" anlamına gelir. büyük ya da eşittir 1 " – SlavaGu

+0

Sanırım şimdiye kadar ne söylediğini anlıyorum, ama eğer cc166 1 (veya 2, 3, vb.) döndürürse VE" TaskingVXToVisualReformat.exe "0 döndürürse ne olur? cc166 gerçekten başarısız olmasına rağmen, başarı, –

1

ve pipefail özelliği faydalanmak:

Bir boru hattının çıkış durumu, pipefail seçeneği etkinleştirilmediği sürece, boru hattındaki son komutun çıkış durumudur. Pipefail etkinleştirilirse, boru hattının dönüş durumu, sıfır olmayan bir durumla çıkmak için son (en sağdaki) komutun değeri veya tüm komutlar başarıyla çıkarılırsa sıfırdır.

en basit test ile deneyelim: Biz varolan dosya ile çalıştırın Eğer

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

, çıkış kodu 0 olacak (boru geçirilir):

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

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

: diğer tarafta komut üzerine

yok olan dosya ile başarısız n davanız size

bash -c "compilation_script.sh MyCFile.c" 

Not aracılığıyla dolaylı

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

gibi bir komut derleme talimatlarını koymak ve (mümkünse) doğrudan arayabilir veya gerekir: pipefail seçeneği tanıtıldı bash sürümü 3.

İlgili konular