Повторный запуск с > оставляет в файле один последний вывод. Журнал, который копится от запуска к запуску, пишут иначе.
Перед запуском команды оболочка открывает файл, который стоит после >. Если файл есть, она стирает его содержимое, если нет — создаёт пустой. Только потом запускается команда. Поэтому прежний текст пропадает, даже когда команда упала, не напечатав ни строки.
>> открывает файл для дописывания: вывод встаёт в конец, прежние строки остаются. Если файла нет, >> создаст его, как и >. Так ведут журналы: каждый запуск добавляет строку.
С потоком ошибок так же: 2> перезаписывает файл, 2>> дописывает в него.
В notes.txt была строка first. Ты выполнил ls /no-such-dir > notes.txt, и ls напечатал ошибку. Что теперь в notes.txt?
-
Оболочка стёрла notes.txt до запуска ls, ещё до ошибки.
cat notes.txtничего не напечатает. -
Сообщение ушло в поток 2, на экран:
>перенаправил поток 1, а в него ls ничего не напечатал. -
>стёр файл до запуска команды, так чтоfirstпропала; сообщение ушло в поток 2, на экран. Дописывает в конец>>.
Оболочка открыла notes.txt для > и стёрла его ещё до запуска ls. В поток 1 ls ничего не напечатал, а ошибку отправил в поток 2 — на экран. Поэтому cat notes.txt ничего не печатает.
Главное в шаге
-
>стирает файл ещё до запуска команды,>>дописывает вывод в конец. -
Файл, который пополняется от запуска к запуску, ведут через
>>и2>>.