Почему перенаправление bash на файл происходит в режиме добавления

Ответы:

19

Единственное, чего вам не хватает, так это того, что вы открываете (и обрезаете) файл fтолько один раз, во время execвызова. Две echoкоманды просто записывают в уже открытый дескриптор файла. Поэтому файл fне будет обрезан ни одним из echoвызовов.

Чтобы перенаправить стандартный вывод в дескриптор файла, синтаксис - это >&nгде nнебольшое положительное целое число, обозначающее дескриптор файла ( >>&nперенаправление отсутствует ). Дескриптор файла должен быть уже связан с открытым файлом, чтобы это работало. Это процесс открытия файла и связывания его с дескриптором, exec 3>fкоторый усекает файл ( exec 3>>fне обрезал бы файл и открыл бы его в режиме добавления). Просто запись с помощью >&3не открывает файл и не усекает его.

Было бы иначе, если бы ты сделал

echo foo >f
echo bar >f
cat f

(каждый echoоткрывается и усекается f), или, более запутанный,

exec 3>f; echo foo >&3
exec 3>f; echo bar >&3
exec 3>&- # close fd 3
cat f

(файл открывается и усекается execперед каждым echo).

Кусалананда
источник