Postagem em destaque

Criando bot do Telegram em Shell script com ShellBot

Criando arquivo de configuração

Um arquivo de configuração é onde podemos guardar informações que podem ser facilmente alteradas sem a necessidade de recompilação de nosso script, ou seja, basta alterarmos esse arquivo e reiniciar o script que as alterações serão aplicadas. Em alguns casos os arquivos são gerados previamente sem intervenção do usuário. E quando precisamos gerar configurações personalizadas com base nas informações fornecidas pelo próprio usuário ? E se essas informações precisam ser inseridas durante a execução do Script ? Como devo proceder ?

Existem alguma formas de resolver esses problemas, porém existe uma que merece ser mencionada. O comando cat !! Com ele poderemos criar e gerar essas configurações personalizadas a nível de execução.

Sintaxe


cat > ARQUIVO << EOF
... 
...
EOF

Parâmetro Descrição
EOF Expressão chave que delimita o final do arquivo
EOF pode ser qualquer expressão definida pelo usuário.



1. Criando arquivo de configuração.


Vou criar um arquivo com algumas variáveis de ambiente utilizadas pelo nosso hipotético script.

$ cat > test.conf << EOF
> DIR=/opt
> USUARIO=shaman
> DIR_EXEC=/usr/bin
> EOF 
Utilizando o redirecionador ‘>’ faz com que o comando cat sobrescreva o arquivo test.conf se ele existir. 

Note que ao digitar a primeira linha de comando, o shell exibe um prompt de inserção que aguarda os dados a serem inseridos pelo usuário.

Visualizando arquivo de configuração


$ cat test.conf
DIR=/opt
USUARIO=shaman
DIR_EXEC=/usr/Bin
O arquivo foi criado e as informações armazenadas com sucesso, mantendo os padrões de formatação como se estivesse editando o arquivo com um editor de texto.

Entendendo a execução:

Descrição de execução do comando cat.

Essa foi a forma mais simples de se criar um arquivo de configuração com informações estáticas.

2. Anexando informações em um arquivo já existente.


Em alguns casos precisamos anexar novas informações no arquivo sem sobrescreve-lo e nem alterar os dados já existentes. Para isso precisamos utilizar o caractere de redirecionamento duas vezes '>>' ao invés de uma '>'. Vamos aproveitar o arquivo criado anteriormente para anexar as novas informações.

$ cat >> test.conf << EOF
> MEU_HOME=/home/shaman
> MEU_BASH=/sbin
> EOF
Utilizando os redirecionadores '>>', faz o comando cat anexe os novos dados no final do arquivo, mantendo os dados já existentes.

Visualizando o arquivo.

$ cat test.conf
DIR=/opt
USUARIO=shaman
DIR_EXEC=/usr/Bin
MEU_HOME=/home/shaman
MEU_BASH=/sbin

3. Gerando configurações dinâmicas.


Muitas aplicações utilizam scripts em suas instalações para determinar configurações cruciais para o funcionando dos seus serviços e essas informações são requeridas durante ou após instalação. O script fornece uma interface de interação com o usuário, seja ela gráfica ou não para captura dos dados que são organizados e gravados no arquivo de configuração.

Criei um pequeno script que demonstra essa aplicação.

Script: conf.sh

#!/bin/bash

# Host de destino
read -p 'HOST: ' HOST

# Porta de conexão
read -p 'PORTA: ' PORTA

# Protocolo de conexão
read -p 'PROTOCOLO: ' PROTOCOLO

# Cria o arquivo e salva os dados armazenados nas variáveis.
cat > ini.conf << EOF
HOST=$HOST
PORT=$PORTA
PROTOCOL=$PROTOCOLO
EOF
# Finaliza o prompt de entrada de dados

echo -------------
# Cabeçalho
echo 'Arquivo: ini.conf'
echo 'Visualizando conteúdo...'

# Lista o conteúdo do arquivo criado 'ini.conf'
cat ini.conf
#FIM 

Testando...

$ ./conf.sh
HOST: servidor.dominio 
PORTA: 22
PROTOCOLO: TCP
-------------
Arquivo: ini.conf
Visualizando conteúdo...
HOST=servidor.dominio
PORT=22
PROTOCOL=TCP
O Script armazenou os dados capturados pelo comando read e armazenou nas variáveis HOST, PORTA e PROTOCOLO, depois os valores foram interpretados na estrutura do comando cat onde as variáveis for emitidas.


4. Gerando configurações utilizando nomes literais de variáveis. 


Em alguns casos, o script pode utilizar uma variável de ambiente existente armazenada em seu arquivo de configuração para execução de determinadas tarefas. Ele necessita especificamente da nomenclatura da variável e não o seu valor.

Para gravar o nome literal de uma variável sem que ela seja interpretada e seu valor convertido, precisamos criar uma forma de escape. Devemos utilizar a '\' (contra-barra) antes nomenclatura.

Exemplo: \$var

Gerando arquivo de configuração sem interpretar o valor da variável $PATH.

$ cat > init.conf << EOF
> PATH=\$PATH:/home/shaman/.bin
> EOF
O caractere '\' (contra-barra) impede que o shell interprete a variável.

Visualizando arquivo.


$ cat init.conf
PATH=$PATH:/home/shaman/.bin

A importância nesses casos de usar a nomenclatura e não o valor; é que criamos uma espécie de ponteiro de acesso direto a variável, ou seja, independente do valor que ela venha receber, não haverá necessidade de alterar o arquivo de configuração ao contrário do valor previamente interpretado e armazenado.

Agora imagine que você precise gerar um arquivo com centenas de linhas e cada linha com uma variável que precisa ser escapada. Já pensou inserir a '\' em todas elas ? Claro que não haverá necessidade, pois tenho um macete salvador de vidas. Insira a '\' (contra-barra) antes do EOF (expressão chave).

Exemplo: cat > arquivo << \EOF

Testando...

$ cat > teste.conf << \EOF
> VAR1=$BASH
> VAR2=$DISPLAY
> VAR3=$XDG_CURRENT_DESKTOP
> VAR4=$XAUTHORITY
> VAR5=$LANGUAGE
> EOF

Visualizando arquivo.


$ cat teste.conf
VAR1=$BASH
VAR2=$DISPLAY
VAR3=$XDG_CURRENT_DESKTOP
VAR4=$XAUTHORITY
VAR5=$LANGUAGE

Expressão chave (EOF)


A expressão chave é uma sequência de caracteres que informa ao comando cat o final do arquivo. Uma vez que a linha é lida e a expressão encontrada, imediatamente é finalizada a gravação no arquivo e o comando encerrado. A nomenclatura EOF que significa (End Of File) é utilizada apenas para seguir um padrão, ficando a critério do usuário escolher sua própria expressão se assim desejar.

Exemplo: cat > arquivo << FIM

Testando...

$ cat > test.conf << FIM
> HOST=server.dominio
> PORT=22
> FIM

Visualizando arquivo.

$ cat test.conf
HOST=server.dominio
PORT=22

Caso queira utilizar uma expressão composta, não esqueça de colocá-la entre aspas simples (') ou duplas (").

Exemplo: cat > arquivo << 'ESTE É O FIM'

Outro detalhe importante é com a indentação do código. A expressão chave no final da estrutura deve ficar alinhada a margem esquerda, enquanto os demais podem seguir a indentação. Mas cuidado, qualquer espaço na estrutura será refletido no arquivo.

Testando...

#!/bin/bash
...
    cat > test.conf << EOF
        HOME=/home/shaman
EOF
...


Visualizando arquivo.


$ cat test.conf
        HOME=/home/shaman

Errado
#!/bin/bash
...
cat > test.conf << EOF
        HOME=/home/shaman
  EOF   # ERRO
... < -
... < -| cat
... < -
Se estiver dentro de um script, irá interpretar como se todo o resto do código abaixo fizesse parte da estrutura do cat.

Para finalizar vou explicar porque optei pelo comando cat e não outros como: echo, tee e etc. Apesar de funcionarem, o cat apresenta uma clareza em sua estrutura, permitindo melhor visibilidade no código e uma dinâmica de controle maior.

Abaixo estão 2 códigos que exercem a mesma função, que é criar um arquivo de configuração. Me diga qual deles é mais fácil de entender.

Com echo

$ echo -e 'VAR1=$BASH\nVAR2=$DISPLAY\nVAR3=XDG_CURRENT_DESKTOP\nVAR4=$XAUTHORITY\nVAR5=$LANGUAGE' > test.conf

Com cat


$ cat > teste.conf << \EOF
> VAR1=$BASH
> VAR2=$DISPLAY
> VAR3=$XDG_CURRENT_DESKTOP
> VAR4=$XAUTHORITY
> VAR5=$LANGUAGE
> EOF
Nâo resta dúvidas não é mesmo ?!!!

Em relação ao tee, posso dizer que ele é ótimo quando precisamos criar vários arquivos a partir de uma matriz.

cat teste.conf | tee arq1.conf arq2.conf arq3.conf ...

Espero ter esclarecido as suas dúvidas na implementação do cat na criação de arquivos de configuração. Mas qualquer dúvida é só gritar !! 😆😃
Deixe seu comentário, participe dando suas sugestões. Um grande abraço e até a próxima. Vlw !!!

Comentários

Contato

Nome

E-mail *

Mensagem *