2017-02-17 3 views
0

j'utilisais scons (outil de construction python) qui appelle gcc pour construire un fichier, comme ceci:Shell redirect: scons appelle gcc, redirections d'erreur ne fonctionne pas

$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. 

Alors j'essaie de sauver tous sortie vers un fichier. Je suppose que les messages d'erreur sont stderr, alors j'essaie de rediriger fd = 2 à fd = 1 comme ceci:

$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 

Mais semble ERROR1 ne contient des informations de commande « scons » lui-même. Tous gcc messages d'erreur sont toujours à l'écran, et non enregistrés dans « error1 »

$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. 

Alors, comment faire tous les scons appelés progrems réacheminer leur fd = 2 à fd = 1? Ou est-ce une limitation de la redirection de shell que seul le flux du premier appelant pourrait être redirigé?

+0

[BashFAQ # 55] (http://mywiki.wooledge.org/BashFAQ/055) semble extrêmement pertinent. –

+0

Vous pouvez également voir cet article: [Dans le shell, que signifie 2> & 1?] (Http://stackoverflow.com/questions/818255/in-the-shell-what-does-21-mean?noredirect = 1 & lq = 1) – codeforester

+0

Je n'ai pas lu toutes les réponses, mais la question ne semble pas couvrir l'ordre entre les redirections - ce qui est plus qu'un peu pertinent. –

Répondre

2

Les redirections sont exécutées de gauche à droite, en se référant à l'état de leur destination au moment où l'exécution immédiatement terminée a été effectuée.

  • 2>&1 >error1 est exécuté dans l'ordre suivant des opérations:

    1. FD 2 est pointée selon la destination FD 1 a été réalisé lorsque l'opération a commencé (puisque vous signalez que le contenu est écrit à l'écran, c'est probablement votre terminal). FD1 est pointé vers le fichier error1.

  • >error1 2>&1 est exécuté dans l'ordre suivant d'opérations:

    1. FD 1 est pointé vers le fichier error1

    2. FD 2 est pointé vers l'emplacement FD 1 points actuellement à (ainsi, également le fichier error1).


Ainsi, dans le 2>&1 >error1 cas, seule FD 1 (stdout) - et non FD 2 (stderr) - pointe vers error1, depuis quand 2>&1 est invoquée, FD 1 est dirigé vers le terminal.