Выполнение этого непосредственно в .bash_profile
(или .bashrc
или любом другом подобном файле) потребовало бы управления соответствующей частью файла, оставляя другие части без изменений. Эта проблема имеет простое общее решение:
- Не меняйте
.bash_profile
снова и снова.
- Создайте как
~/.my_tokens
которые вы бы изменили, добавили, возможно, полностью переписали.
Исходный код нового файла из .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
получит либо старую версию, либо новую полностью. Если вы обновите файл на месте, можно будет прочитать его как неполный или частично обновленный; Вы, конечно, не хотите этого.