Основная проблема, которую необходимо решить, — конфликты имен программ.
Наличие большого PATH
больше не проблема, так как в оболочке Bourne есть хеш для расположения двоичных путей, т.е. 1977.
Необычно иметь символические ссылки, за исключением одной причины:
To be able to have an own selection of programs that differs from the cluster view.
Если вы, например. установите PATH на:
PATH=/usr/gnu/bin:/usr/bin
вы найдете все инструменты GNU перед стандартными системными инструментами.
Это может позволить вам легко использовать инструменты GNU, но это также приводит к необходимости, например,. использовать GNU chmod
, в котором отсутствует поддержка ACL, и использовать GNU tar
, который известен тем, что создает архивы с проблемами переносимости.
Предположим, что вы в основном заинтересованы в GNU xgettext
, но в остальном предпочитаете использовать официальные системные инструменты, которые включают поддержку расширенных системных функций, о которых инструменты GNU не знают. Это можно сделать, создав собственный каталог bin, например. вызов:
mkdir ~/bin
Если вы затем создадите символическую ссылку:
cd ~/bin
ln -s /usr/gnu/bin/xgettext
и установите этот ПУТЬ:
PATH=~/bin:/usr/bin:/usr/gnu/bin
вы получите GNU xgettext, если вы позвоните xgettext
, но официальные системные инструменты, если вы позвоните, например. chmod
или tar
. Поскольку обычно есть символические ссылки на инструменты GNU, но с их собственным префиксом в /usr/bin/
(, например. с /usr/bin/gtar
по/usr/gnu/bin/tar
)вы по-прежнему можете намеренно использовать GNU tar, вызвав gtar
.
Кстати,:/opt/bin
не является частью стандарта UNIX FHS, и в этом стандарте перечислены
/opt/<vendor>/bin
, а не
/opt/<project>/bin
хотя есть примеры и последнего.
Если бы только этот текстовый файл был в формате json.
Затем мы могли бы прочитать файл, скажем, в python, превратить его в объект, а затем вы могли бы просто сказать:
object.repo1.image.tag="newest1";
object.repo2.image.tag="newest2";
, а затем преобразуйте его в строку и запишите обратно в файл. Тогда было бы легче читать, писать и поддерживать. Но поскольку файл пока застрял в текстовом файле, давайте сделаем это трудным путем.
cat thefile | sed '/repo1:/, /tag/ s/tag:\slatest/tag: newest1/g' | sed -e '/repo2:/,$ s/tag:\slatest/tag: newest2/g';
На самом деле это три части. Сначала мы просто загружаем файл в поток.
Затем мы получаем первый паттерн, поэтому действуем на все строки между паттернами /repo1 :/ и /tag/. И в этих строках мы заменяем /tag :\slatest/ на /tag :newest/.
Затем мы снова делаем то же самое, за исключением repo2. С repo2 он смешался с repo2 в разделе глобальных переменных в верхней части файла. Он совпал в глобальной части, а затем перешел к первому тегу и подумал, что это и есть желаемый шаблон.
Я обошёл это, сказав, что диапазон до -равен $. То есть до конца файла.
Я не мог понять, как указать новые строки в диапазонах слов в sed. Тогда я мог бы сопоставить /\nrepo2/. Что указывало бы только на последний repo2, как и текущее решение.
С диапазоном $ текущее решение начнет делать избыточные замены, если файл станет длиннее и начнет содержать больше экземпляров /tag :last/.
Используя python
, способ редактирования этого файла состоит в том, чтобы импортировать модуль yaml, а затем загрузить файл yaml в словарь python, также известный как hash | ассоциативный массив, хотя и вложенный.
Затем мы переходим к настройке значений ключей в файле yaml.
Наконец, мы сохраняем словарь обратно в файл yaml.
Код sed предназначен для вставки пустых строк в узлы верхнего уровня, если файл yaml.
$ yaml_file='values.yaml'
$ python3 - "$yaml_file" <<\YAML
import sys, yaml
yaml_doc = sys.argv[1]
with open(yaml_doc) as fp:
h = yaml.safe_load(fp)
h['repo1']['image']['tag'] = 'newest1'
h['repo2']['image']['tag'] = 'newest2'
with open(yaml_doc, 'w') as fp:
yaml.safe_dump(h, fp, default_flow_style=False)
YAML
$ sed -Ei -e '1!{/^\S/{H;z;x;};}' "$yaml_file"