Наконец-то я понял. Оказывается, к сети подключался старый сотовый телефон. Хотя я зарезервировал IP-адрес для сервера, маршрутизатор беспечно проигнорировал это резервирование и просто сбрасывал сервер со своего места всякий раз, когда об этом просил телефон. К счастью, остальная часть конфигурации сервера в порядке (или, по крайней мере, не требует серьезной операции ).
Я знал, что роутер дерьмовый, но никак не ожидал такой захватывающей дерьмовости; мне потребовалось довольно много времени, чтобы во всем разобраться. Надеюсь, этот ответ послужит предостережением для кого-то там.
Если я неправильно понял вопрос, sed
должен работать, пока вы добавляете ^
и $
вокруг регулярного выражения. Например
sed 's/^REFRESH_TOKEN=$/REFRESH_TOKEN={token}/g'
будет работать, потому что он будет соответствовать REFRESH_TOKEN=
, только если это единственная вещь в строке, секция REFRESH_TOKEN=$(some api call)
не должна быть затронута из-за содержимого после=
Вы также можете ограничить область действия sed, выполнив что-то вроде sed '2 s/REFRESH_TOKEN=/REFRESH_TOKEN={token}/g'
, но это хорошее решение, только если вы уверены , что строка, которую нужно заменить, всегда будет строкой номер 2
REFRESH_TOKEN=$(some api call)
sed '2 s/^REFRESH_TOKEN=.*/REFRESH_TOKEN='"$REFRESH_TOKEN/" -i "$0"
Здесь sed специально указано модифицировать только вторую строку скрипта
или вместо 2 вы можете использовать диапазон, используя номера строк:
sed '1,5 s/
...
или рисунок
sed '1,/^#END-OF-SETTINGS-MARKER#/ s/
...
Следующая строка инкапсулирует логику скрипта bash:
: ${REFRESH_TOKEN:="$(some api call)"}
Он инициализирует переменную токена обновления только в том случае, если это не было сделано ранее. Начальное значение берется путем запуска вызова веб-API.
Прочтите bash parameter substitutions
в руководстве bash для получения дополнительной информации.