У меня есть программа, которая генерирует некоторые временные токены безопасности в файле. Затем я должен вручную скопировать токены из этого файла и вставить его в свой профиль bash, чтобы продолжить.Срок действия токенов истекает каждые 30 минут, поэтому я должен их регенерировать и вручную обновлять bash_profile каждые 30 минут.

Я хочу знать погоду, если можно программно обновлять и перезагружать .bash_profile с терминала Mac при изменении некоторых других системных файлов.

Например, я могу запустить эту команду в Терминале, и она добавит строку в мой .bash_profile:

echo 'export Token=abc' >>~/.bash_profile

Как я могу обновить значение Token с abc на xyz в моем терминале?

ПРИМЕЧАНИЕ: это НЕ запрос кода / сценария, а просто поиск некоторых направлений и идей, чтобы сэкономить время в моем ежедневном рабочем процессе.

1 ответ1

1

Выполнение этого непосредственно в .bash_profile (или .bashrc или любом другом подобном файле) потребовало бы управления соответствующей частью файла, оставляя другие части без изменений. Эта проблема имеет простое общее решение:

  1. Не меняйте .bash_profile снова и снова.
  2. Создайте как ~/.my_tokens которые вы бы изменили, добавили, возможно, полностью переписали.
  3. Исходный код нового файла из .bash_profile . Это единственное (и единовременное) изменение, которое вы вносите непосредственно в .bash_profile:

    . ~/.my_tokens
    

Теперь вам решать, как вы управляете новым файлом. Если файл содержит всего несколько токенов, самый простой способ его обновления - перезаписать его полностью.

И в случае изменений может быть достаточно снова получить только источник .my_tokens , а не весь .bash_profile .

Вы можете собрать много таких файлов в каталоге и получить их все:

# ~/my_extensions is a directory with no subdirectories
for f in ~/my_extensions/*; do
   . "$f"
done

Общая идея состоит в том, чтобы отделить "динамические" токены от вашего полустатического .bash_profile .


Идея обновления этих токенов в каждом существующем сеансе Bash каждые 30 минут или около того кажется, по меньшей мере, не элегантной. Подумайте о том, чтобы читать их по требованию (не через .bash_profile ). Допустим, foo - это какая-то внешняя команда, которой нужны эти токены. Создайте функцию-обертку:

foo() ( . ~/my_tokens; command foo "$@" )

Теперь, если вы foo , функция загрузит текущие токены и вызовет настоящую утилиту foo . Обратите внимание, что все тело функции находится в подоболочке, поэтому токены не доступны для текущей оболочки (если вы не получили отдельный файл). Чтобы получить токены в текущей оболочке, определите функцию следующим образом:

foo() { . ~/my_tokens; command foo "$@"; }

Примечание: для глобальных токенов вы должны использовать какой-либо путь вне каталога любого пользователя; пример для Linux: /run/foo_tokens .


Атомарное обновление ~/my_tokens (или /run/foo_tokens или любого другого файла) может быть выполнено с помощью mv . Вы создаете временный файл в той же файловой системе, заполняете его данными, а затем перезаписываете старую версию за один последний шаг:

mv ~/temp_tokens ~/my_tokens

Это гарантирует, что любой доступ к ~/my_tokens получит либо старую версию, либо новую полностью. Если вы обновите файл на месте, можно будет прочитать его как неполный или частично обновленный; Вы, конечно, не хотите этого.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .