учитывая этот фрагмент:
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
).