2017-02-17 28 views
0

я использовал SCons (питон сборки инструмента), который вызывает GCC для создания файла, например:Shell переадресацией: SCons называет GCC, строить Перенаправление ошибок не работает

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

Тогда я пытаюсь сохранить все вывод в файл. Я предполагаю, что сообщения об ошибках в STDERR, поэтому я стараюсь, чтобы перенаправить FD = 2, бериеся = 1, как это:

$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 

Но кажется Error1 содержит только информацию о команде «Scons» сам по себе. Все НКУ сообщения об ошибках все еще на экране, не сохраняются в «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. 

Итак, как сделать все SCons называемых progrems перенаправлять их FD = 2, бериеся = 1? Или это ограничение перенаправления оболочки, которое может быть перенаправлено только потоком верхнего вызывающего абонента?

+0

[BashFAQ # 55] (http://mywiki.wooledge.org/BashFAQ/055) представляется чрезвычайно уместным. –

+0

Вы также можете увидеть этот пост: [В оболочке, что означает 2> и 1?] (Http://stackoverflow.com/questions/818255/in-the-shell-what-does-21-mean?noredirect = 1 & lq = 1) – codeforester

+0

Я не прочитал все ответы, но вопрос, похоже, не охватывает порядок между перенаправлениями, что более чем немного уместно. –

ответ

2

Перенаправления выполняются слева направо, ссылаясь на состояние их места назначения с момента, когда сразу же было выполнено одно завершение выполнения.

  • 2>&1 >error1 выполняется в следующем порядке операций:

    1. FD 2 указывается в зависимости от того назначения FD 1 был направлен, когда операция началась (так вы сообщаете, что содержание написано на экран, это, по-видимому, ваш терминал).

    2. FD 1 указывает на файл error1.

  • >error1 2>&1 выполняется в следующем порядке операций:

    1. FD 1 заострен в файл error1

    2. FD 2 заострен на место FD 1 в настоящее время указывает на (таким образом, также файл error1).


Таким образом, в 2>&1 >error1 случае, только FD 1 (стандартный вывод) - и не FD 2 (STDERR) - указывает на error1, так как, когда 2>&1 вызывается, FD 1 направлена ​​на терминал.