Проблемы с использованием команды sed с переменными

С помощьюhttps://www.reddit.com/r/i3wm/comments/94vknq/install_i3_from_centos_minimal_iso/иhttps://copr.fedorainfracloud.org/coprs/admiralnemo/i3wm-el7/вот как я установил i3 Window Manager в CentOS 7.6.1810 ,

01. Введите следующие команды:

$ yum install -y epel-release
$ yum clean all && yum update -y && yum upgrade -y
$ yum install -y xorg-x11-server-Xorg xorg-x11-drv-vmware xorg-x11-drv-vmmouse xorg-x11-drv-evdev mesa-dri-drivers xorg-x11-xinit-session xterm
$ yum install -y dejavu-sans-fonts dejavu-sans-mono-fonts dejavu-serif-fonts i3 i3status lightdm
$ systemctl set-default graphical.target
$ systemctl isolate graphical.target

02. Выберите i3 справа вверху и войдите на сервер,

enter image description here

03. При первом входе в систему он настроит i3(дважды нажмите Enter, если конфигурация по умолчанию подходит ),

enter image description here

enter image description here

Вот и все. Наслаждаться!

0
27.04.2021, 10:31
1 ответ

Не следует использовать sedдля работы с файлами YAML или файлами, написанными в любом структурированном формате документа. (YAML, JSON, XML и т. д. )Вместо этого используйте синтаксический анализатор, написанный для этого формата документа.

Для YAML есть два хороших инструмента, написанных для оболочки, оба имеют сбивающее с толку название yq. yqизhttps://kislyuk.github.io/yq/— простая в использовании jqоболочка (, а jq— парсер JSON ).

Для части этого ответа я предполагаю, что вы определили две переменные оболочки old_commitи new_commitточно так, как показано в вашем коде в вопросе. Вывод, который вы показываете позже, говорит мне, что вы на самом деле назначаете их не как статические строки, а через какой-то другой процесс, о котором вы ничего не говорите о (, в котором $old_commit, кажется, получает завершающий символ новой строки ), поэтому я не могу много говорить об этом и буду игнорировать это.

Чтобы изменить значение клавиши imageв back, в services, используя эту реализацию yq, вы должны использовать

yq -Y '.services.back.image |= "index.docker.io/gg/back:h3912kk"' file.yml

или, используя ваше значение $new_commit:

new_commit='back:h3912kk'

yq -Y --arg new "$new_commit" \
    '.services.back.image |= 
        "index.docker.io/gg/" + $new' file.yml

Обратите внимание, что мы импортируем значение переменной оболочки в выражение, используя --arg, создавая yqпеременную $new,вместо того, чтобы вводить его непосредственно в строку выражения. Таким образом мы гарантируем, что значение правильно закодировано с помощью yq, а также гарантирует, что в нашем коде нет уязвимостей, связанных с внедрением кода.

Или, не упоминая строку index.docker.io/gg/:

new_commit='back:h3912kk'

yq -Y --arg new "$new_commit" \
    '.services.back.image |=
        sub("[^/]*$"; "") + $new' file.yml

Или, используя отдельную переменную для репозитория:

new_commit='back:h3912kk'

yq -Y --arg new "$new_commit" --arg repo 'back' \
    '.services[$repo].image |=
        sub("[^/]*$"; "") + $new' file.yml

Мы также могли бы использовать строку $old_commitдля поиска правильного изображения для замены вместо того, чтобы идти по статическому пути:

old_commit='back:1.0.1'
new_commit='back:h3912kk'

yq -Y --arg old "$old_commit" --arg new "$new_commit" \
    '(.services[].image | select(endswith($old))) |=
        (rtrimstr($old) + $new)' file.yml

Здесь мы выбираем все.services.*.imageпути, которые заканчиваются любой строкой в ​​$old_commit, а затем обрезаем ее с конца и заменяем на $new_commit.

Каждая из приведенных выше команд, учитывая пример документа YAML в вопросе, будет производить

version: '3'
services:
  mongo:
    container_name: mongo
    image: mongo:3.4
    volumes:
      - /home/mongo_files:/data/db
    networks:
      my_network: null
  back:
    container_name: back
    image: index.docker.io/gg/back:h3912kk
    networks: my_network
networks:
  my_network: null

, и вы легко сможете перенаправить вывод в новый файл (или отредактировать документ YAML в месте -с помощью--in-place).

Инструмент yq, который вы получаете от snap, например. Ubuntu отличается, и я обычно использую его для преобразования YAML в JSON (, а затем обратно ):

.
yq -j e file.yml |
jq '.services.back.image |= "index.docker.io/gg/back:h3912kk"' |
yq -P e

Учитывая пример файла YAML, это дает тот же результат, что и выше. Приведенное выше выражение jqможно заменить любым из выражений в верхней части этого ответа с той же семантикой.

3
28.04.2021, 22:50

Теги

Похожие вопросы