Создайте безопасный файл конфигурации для zsh-скриптов

Сам нашел:

Проблема заключалась в том, что я добавил собственное сочетание клавиш для xfce4-terminal --drop-downна клавишу§(в нашей раскладке это клавиша «тильда» ), которая сохраняется в конфигурации как<property name="section" type="string" value="xfce4-terminal --drop-down"/>

Если я удалю этот ярлык (или отредактирую его на Super + §), все будет работать как положено.

1
17.08.2021, 21:10
1 ответ

Я не могу придумать какой-либо функции в zsh, которая облегчила бы это, помимо средств обработки строк, предлагаемых расширением параметра .

Вот некоторый код, который анализирует строки KEY=VALUE в ассоциативный массив configсо следующими ограничениями:

  • Ключи могут содержать только буквы ASCII, цифры и символы подчеркивания. Ключи не могут начинаться с цифры и не могут быть пустыми.
  • Значения могут содержать любую строку байтов, кроме символов новой строки и нулевых байтов. Обратите внимание, что это может включать недопустимые последовательности в многобайтовой кодировке, такой как UTF -8.
  • Пустые строки (строки, содержащие только горизонтальные пробелы ASCII )и строки комментариев (строки, начинающиеся с пробела и #), игнорируются.
  • Никакого расширения не происходит :ни подстановки переменных, ни заключения в кавычки, ни удаления пробелов.
function parse_config {
  emulate -LR zsh
  setopt extended_glob
  local n=0 line lines
  local LC_ALL=C
  lines=("${(@f)$(<$1)}")
  for line in "${(@)lines}"; do
    ((++n))
    line=${line##[$' \t']##}
    if [[ -z $line || $line == \#* ]]; then
      continue
    elif [[ $line = *$'\0'* ]]; then
      echo >&2 "$1:$n:Null character in configuration file"
      config=()
      return 1
    elif [[ $line == [A-Z_a-z][0-9A-Z_a-z]#\=* ]]; then
      config[${line%%=*}]=${line#*=}
    else
      echo >&2 "$1:$n:Syntax error in configuration file"
      config=()
      return 1
    fi
  done
}

Чтобы вызвать эту функцию:

set -e
typeset -A config
parse_config /path/to/config/file

echo "Configuration dump:"
for k in ${(ko)config}; do
  print -lr "$k=$config[$k]"
done
0
20.08.2021, 10:26

Теги

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