javac file.java 2> log.txt
Причина в том, что у вас есть два дескриптора выходного файла вместо одного. Обычно это стандартный вывод, который вы можете перенаправить с помощью>, и он должен использоваться для получения результата. Второй, stderr, предназначен для удобочитаемого вывода, такого как предупреждения, ошибки, текущее состояние и т. Д., Этот перенаправляется с помощью 2>.
Ваша вторая строка, используя 2> & 1, перенаправляет stderr в stdout и, наконец, stdout в log.txt.