Ответ № 1: расовый конфликт
head nofile text1 1> output.txt 2> output.txt # - я знаю, что это не сработает.`
Это на самом деле работает, даже если не так, как вы ожидали, и не соответствует вашей цели.
У вас есть 2 дескриптора файла, которые будут перенаправлены независимо в один и тот же выходной файл с помощью > output.txt
.
Один дескриптор файла будет действовать быстрее: он создаст файл output.txt и начнет писать внутри него.
Когда второй дескриптор файла начнет действовать, он воссоздает тот же файл (> output.txt
), стирая то, что внутри.
Вы потеряете первую часть, написанную первым дескриптором файла, если таковая имеется.
Ожидайте искаженный вывод, особенно с длинными выходами. Смотрите этот ответ тоже .
Учтите, что поведение не всегда воспроизводимо. В моей системе сегодня файл создается с ошибкой внутри в виде первой строки и текста после.
head nofile text1 1> output.txt 2> & 1 # ok это работает
Это работает, потому что сначала вы меняете перенаправление для стандартного вывода на файл output.txt
. Затем вы просите перенаправить стандартную ошибку в то же место назначения стандартного вывода, что означает файл output.txt
.
Ответ № 2: вопросы заказа
Суть ответа: перенаправление bash не является коммутативным, это означает, что порядок имеет значение:
заголовок nofile text1 2> & 1 1> output.txt
заголовок nofile text1 2> & 1> output.txt
Здесь, прежде чем просить перенаправить стандартную ошибку на стандартный выходной адрес (вероятно, текущий tty). Затем вы просите изменить только стандартный вывод на выходной файл output.txt
. (обе команды 1>output.txt
и >output.txt
действуют одинаково). Стандартная ошибка остается перенаправленной, где это было раньше (вероятно, текущий tty).