2017-02-17 6 views
0

Ich war mit scons (Python Build-Tool), die gcc ruft zum Aufbau einer Datei, wie folgt aus:Shell Umleitung: scons ruft gcc, bauen Fehler Umleitung funktioniert nicht

$scons 
scons: Reading SConscript files ... 
scons: done reading SConscript files. 
scons: Building targets ... 
g++ -o 1.o -c 1.cpp 
1.cpp:20:5: error: no matching function for call to 'g' 
    g(&obj2); 
    ^
1.cpp:12:6: note: candidate function not viable: no known conversion from 'B *' to 'A &' for 1st argument; remove & 
void g(A&a){ 
    ^
1 error generated. 
scons: *** [1.o] Error 1 
scons: building terminated because of errors. 

Dann versuche ich alles zu retten Ausgabe in eine Datei. Ich nehme an, die Fehlermeldungen in stderr sind, so dass ich versuchen, fd = 2 bis fd = 1 wie folgt umgeleitet werden:

$scons 2>&1 >error1 
1.cpp:20:5: error: no matching function for call to 'g' 
    g(&obj2); 
    ^
1.cpp:12:6: note: candidate function not viable: no known conversion from 'B *' to 'A &' for 1st argument; remove & 
void g(A&a){ 
    ^
1 error generated. 
scons: *** [1.o] Error 1 

scheint aber nur selbst enthält Informationen von „scons“ Befehl ERROR1. Alle gcc Fehlermeldungen werden nach wie vor auf dem Bildschirm, nicht in "error1"

gespeichert
$cat error1 
scons: Reading SConscript files ... 
scons: done reading SConscript files. 
scons: Building targets ... 
g++ -o 1.o -c 1.cpp 
scons: building terminated because of errors. 

So wie alle scons progrems re-direct ihre fd = 2 genannt machen = 1 bis fd? Oder ist dies eine Beschränkung der Shell-Umleitung, dass nur der Stream des obersten Aufrufers umgeleitet werden könnte?

+0

[BashFAQ # 55] (http://mywiki.wooledge.org/BashFAQ/055) scheint sehr relevant. –

+0

Sie könnten diesen Beitrag auch sehen: [In der Shell, was bedeutet 2> & 1?] (Http://stackoverflow.com/questions/818255/in-the-shell-what-does-21-mean?noredirect = 1 & lq = 1) – codeforester

+0

Ich habe nicht alle Antworten durchgelesen, aber die Frage dort scheint nicht die Reihenfolge zwischen Umleitungen abzudecken - was mehr als ein wenig relevant ist. –

Antwort

2

Umleitungen werden von links nach rechts ausgeführt und beziehen sich auf den Status ihres Ziels ab dem Zeitpunkt, zu dem die unmittelbar zuvor abgeschlossene Ausführung abgeschlossen wurde.

  • 2>&1 >error1 wird mit der folgenden Reihenfolge der Operationen ausgeführt:

    1. FD 2 gezeigt wird, je nachdem, was Ziel FD 1 gerichtet war, wenn der Betrieb gestartet (da Sie diesen Inhalt berichten geschrieben auf den Bildschirm, dies ist vermutlich Ihr Terminal).

    2. FD 1 verweist auf die Datei error1.

  • >error1 2>&1 wird mit der folgenden Reihenfolge von Operationen ausgeführt:

    1. FD 1 in die Datei gerichtet ist error1

    2. FD 2 an die Stelle gerichtet wird FD 1 gegenwärtig weist auf (also auch die Datei error1).


, also im 2>&1 >error1 Fall nur FD 1 (stdout) - und FD 2 nicht (Stderr) - zeigt auf error1, da, wenn 2>&1 aufgerufen wird, FD 1 ist auf das Terminal gerichtet.