Когда я выполняю эту команду (где fail.cpp — простая программа, заполненная ошибками компилятора), ошибки выводятся не непосредственно на экран, а в файл fail.out:
g++ fail.cpp > fail.out 2>&1
Исходя из моего начального понимания bash, это имеет смысл: >
перенаправляет вывод программы (stdout, a.k.a. 1) в fail.out, в то время как 2>&1
перенаправляет stderr (a.k.a. 2) в это новое место для stdout, который является файлом. (?)
Но изменение порядка команды делает вещи иначе:
g++ fail.cpp 2>&1 > fail.out
Теперь сообщения об ошибках выводятся прямо на экран, а fail.out — пустой файл.
Почему это? Это похоже на ту же идею, что и выше: перенаправить ошибки, которые эта команда выдаст, в stdout (2>&1
) и перенаправить его, в свою очередь, в файл fail.out. Это порядок операций, который мне не хватает?
2>&1
означает «перенаправить stderr туда, где в данный момент подключен stdout», и перенаправления обрабатываются в порядке слева направо. Итак, первый делает:
Второй делает:
Других решений пока нет …