учитывая этот фрагмент:
exec 3>f
echo foo >&3
echo bar >&3
cat f # returns foo bar
Почему bash добавляет f? Я что-то пропустил?
учитывая этот фрагмент:
exec 3>f
echo foo >&3
echo bar >&3
cat f # returns foo bar
Почему bash добавляет f? Я что-то пропустил?
Ответы:
Единственное, чего вам не хватает, так это того, что вы открываете (и обрезаете) файл 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).