【问题标题】:How to modify INI files from shell script?如何从 shell 脚本修改 INI 文件?
【发布时间】:2011-03-28 20:03:50
【问题描述】:

我正在构建 vnc 的自定义包,并希望确保在包安装后脚本中启用 GDM 的 xdcmp 设置。 gdm.conf 文件是 ini 风格的,即:

[section]
var=name

并且我要设置的值在整个配置文件的不同部分中存在名称冲突。

是否有任何方法或工具可以方便地从 shell 脚本操作 ini 样式的配置文件?

我想在.deb postinst 脚本中解决这个问题。

【问题讨论】:

    标签: shell debian packaging ini


    【解决方案1】:

    看看 crudini 包。它是为从 shell 操作 ini 文件而设计的

    【讨论】:

      【解决方案2】:

      如果您愿意编写一些 Perl,可以使用 Config::IniFiles(包 libconfig-inifiles-perl)。

      【讨论】:

      • 我得出的结论是 perl 是最简单的解决方案。 Debian 打包指南似乎并没有禁止 perl 用于配置脚本,尽管我怀疑添加对 perl 的依赖只是为了安装一个包意味着这将永远不会进入上游。
      • @stsquad:Perl 本身不是问题,它被官方祝福用于 Debian 包脚本(例如,您可以看到perl-base 是必不可少的,debconf 提供 Perl 模块)。必须预先依赖 libconfig-inifiles-perl 可能会更麻烦。
      【解决方案3】:

      使用 Ex 编辑器的 Shell 命令(更改 var 键的值):

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

      要支持 INI 部分,请使用以下语法:

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

      要从 INI 文件中读取值,请参阅:How do I grab an INI value within a shell script?


      这里是有助于编辑 INI 值的 shell 函数(不支持部分):

      # 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 值的 shell 函数(不支持部分):

      # 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
      }
      

      例如ini_get var.

      【讨论】: