Как изменить файлы INI из сценария оболочки?

Я создаю собственный пакет vnc и хотел бы убедиться, что настройки xdcmp GDM включены в сценарии после установки пакета. Файл gdm.conf выполнен в стиле ini, т.е.:

[section]
var=name

И значение, которое я хочу установить, имеет конфликты имен в разных разделах файла конфигурации.

Существуют ли какие-либо методы или инструменты, которые позволяют легко манипулировать конфигурационными файлами в стиле ini из сценариев оболочки?

Я хотел бы разобраться с этим в скрипте .deb postinst.


person stsquad    schedule 12.08.2010    source источник


Ответы (3)


Если вы хотите написать что-нибудь на Perl, есть Config::IniFiles (пакет libconfig-inifiles-perl).

person Gilles 'SO- stop being evil'    schedule 12.08.2010
comment
Я прихожу к выводу, что perl - самое простое решение. Руководство по упаковке Debian, похоже, не запрещает perl для скриптов configure, хотя я подозреваю, что добавление зависимости от perl только для установки пакета будет означать, что это никогда не пойдет вверх по течению. - person stsquad; 12.08.2010
comment
@stsquad: Perl сам по себе не является проблемой, он официально одобрен для использования в сценариях пакетов Debian (и вы можете видеть, например, что perl-base необходим, а debconf предоставляет модули Perl). Необходимость предварительной зависимости от libconfig-inifiles-perl может быть большим препятствием. - person Gilles 'SO- stop being evil'; 12.08.2010

Взгляните на пакет crudini. Он предназначен для манипулирования ini-файлами из оболочки.

person pixelbeat    schedule 12.01.2015

Команда оболочки с использованием редактора Ex (для изменения значения ключа var):

ex +"%s/^var=\zs.*/new_name/" -scwq config.ini

Для поддержки разделов INI используйте следующий синтаксис:

ex +':/\[section\]/,$s/var=\zs.*/new_name/' -scwq config.ini

Для чтения значений из файлов INI см.: Как получить значение INI в сценарии оболочки?


Вот функция оболочки, которая может быть полезна для редактирования значений INI (не поддерживающих разделы):

# Set value in the INI file.
# Usage: ini_set [key] [value] [file]
ini_set()
{
  local key="$1"
  local value="$2"
  local file="$3"
  [ -f "$file" ]
  if [ -n "$value" ]; then
    if grep -q "$key" "$file"; then
      echo "INFO: Setting '$key' to '$value' in $(basename "$file")"
      ex +'%s#'"$key"'=\zs.*$#'"$value"'#' -scwq! "$file"
    else
      echo "$key=$value" >> "$file"
    fi
  else
    echo "WARN: Value for '$key' is empty, ignoring."
  fi
}

Вот функция оболочки для чтения значений INI (не поддерживающих разделы):

# Get value from the INI file.
# Usage: ini_get [key] (file)
ini_get()
{
  local key="$1"
  local file="$2"
  [ ! -s "$file" ] && return
  local value="$(grep -om1 "^$key=\S\+" "$file" | head -1 | cut -d= -f2-)"
  echo "Getting '$key' from $(basename "$file"): $value" >&2
  echo $value
}

E.g. ini_get var.

person kenorb    schedule 11.07.2020