Adicionando entradas do arquivo de configuração a seções específicas

1

Estou tentando escrever um script que configura o mySQL. Vamos dizer que eu quero configurar a porta para 3333, então eu quero que o arquivo de configuração contenha as linhas

[mysqld]
port=3333
[client]
port=3333

No começo, eu estava simplesmente echo ing as novas linhas:

echo "[mysqld]" >> /etc/mysql/my.cnf
echo "port=3333" >> /etc/mysql/my.cnf
echo "[client]" >> /etc/mysql/my.cnf
echo "port=3333" >> /etc/mysql/my.cnf

Mas percebi que o arquivo de configuração conterá todas as entradas várias vezes caso eu o execute várias vezes. Por isso, apliquei uma verificação usando uma função:

function appendconfig {
    grep -qF "" "" || echo "" >> ""
}
cfg=/etc/mysql/my.cnf
appendconfig "[client]" $cfg
appendconfig "port=3333" $cfg
appendconfig "[mysqld]" $cfg
appendconfig "port=3333" $cfg

Essa função só adicionará a linha se ainda não existir.

Infelizmente, ao configurar port=3333 na seção [mysqld] , ele detecta que port=3333 já está presente (mas em [client] ).

Como eu escreveria arquivos de configuração como o do mySQL em um script de bash do Linux?

Basicamente, estou procurando algo como

setconfigvalue <section> <value> <file>

para poder escrever

setconfigvalue [mysqld] port=3333 /etc/mysql/my.cnf

Eu tentei as sugestões de esta pergunta sobre o site irmão da U & amp; L "Editando o INI como arquivos com um script" .

A resposta aceita apenas fornece soluções que são codificadas para o problema do OP. Eu precisaria adaptá-los, mas isso é propenso a erros.

Eu tentei o crudini , que parece ser a ferramenta certa para sua sintaxe. Mas não é possível analisar arquivos de configuração mySQL devido aos includes:

crudini --get /etc/mysql/my.cnf client port
File contains parsing errors: <???>
    [line 22]: !includedir /etc/mysql/conf.d/
    [line 23]: !includedir /etc/mysql/mariadb.conf.d/
    
por Thomas Weller 14.01.2018 / 00:36

1 resposta

2

Descobri que eu tenho a versão 0.7-1 de crudini instalada dos pacotes oficiais. Há uma versão mais recente disponível no Github, 0,9 no momento em que este artigo foi escrito.

Substitui a versão antiga pela nova versão usando wget :

wget -q https://raw.githubusercontent.com/pixelb/crudini/master/crud‌​ini -O /usr/bin/crudini

Dessa forma, a mensagem de erro sobre o erro de análise desapareceu:

crudini --get /etc/mysql/my.cnf mysqld port
Parameter not found: port

Eu consegui definir os parâmetros desejados:

crudini --set /etc/mysql/my.cnf mysqld port 3333
crudini --get /etc/mysql/my.cnf mysqld port
3333
    
por Thomas Weller 14.01.2018 / 02:27