Вам не хватает того, что вы открываете (и усекаете )файл 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
).
Не думали ли вы о том, чтобы создать -файл resolve.conf по умолчанию и настроить сценарий для записи этого файла resolve.conf по умолчанию -в resolve.conf всякий раз, когда вы захотите сбросить его.
Затем вы можете создать скрипт 'resetdns', который запускается только :cp и т. д./по умолчанию -resolve.conf и т. д./resolve.conf
Вероятно, его нужно будет запускать с помощью sudo, но это должно решить вашу проблему.
Кроме того, на главной странице systemd -resolve (https://wiki.archlinux.org/index.php/Systemd-resolved)есть интересная информация. Вы можете добавить статус resolvectl в конец скрипта 'resetdns', чтобы убедиться, что он был сброшен.