bash: путаница с перенаправлением вывода

Когда я выполняю эту команду (где 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. Это порядок операций, который мне не хватает?

1

Решение

2>&1 означает «перенаправить stderr туда, где в данный момент подключен stdout», и перенаправления обрабатываются в порядке слева направо. Итак, первый делает:

  1. Перенаправить стандартный вывод в файл fail.out.
  2. Перенаправить stderr на текущее соединение с stdout, то есть файл fail.out

Второй делает:

  1. Перенаправить stderr к текущему соединению stdout, то есть к терминалу.
  2. Перенаправить стандартный вывод в файл fail.out.
7

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]