Qual é a melhor maneira de ler um arquivo de configuração no bash?
Por exemplo, você tem um script e não está disposto a preencher toda a configuração manualmente sempre que chamar o script.
Edit 1: Eu acho que não deixei claro, então: o que eu quero é ... Eu tenho um arquivo de configuração que é como
variable_name value
variable_name value ...
e eu quero ler isso. Eu sei que eu poderia simplesmente cumprimentá-lo pelos argumentos que estou procurando, mais ou menos ... mas talvez haja uma maneira mais inteligente :)
Respostas:
Como o mbiber disse,
source
outro arquivo. Por exemplo, seu arquivo de configuração (por exemplosome.config
) seria:E seu script pode ter a seguinte aparência:
Os muitos arquivos
/etc/default
geralmente servem como arquivos de configuração para outros scripts de shell de maneira semelhante. Um exemplo muito comum das postagens aqui é/etc/default/grub
. Este arquivo é usado para definir opções de configuração para o GRUB, poisgrub-mkconfig
é um script de shell que o origina:Se você realmente deve processar a configuração do formulário:
Então você pode fazer algo como:
(Você também pode fazer algo assim
eval "$var=$value"
, mas isso é mais arriscado do que obter um script. Você pode inadvertidamente quebrá-lo mais facilmente do que um arquivo de origem.)fonte
=
desde o início?/etc/default
- e principalmente para um bom uso. Se seu usuário sem noção tiver acesso à configuração para algo executando como root, já é uma causa perdida.Obviamente, eu não sou o
bash
especialista aqui, mas o conceito não deve ser diferente no idioma que você usa:Um exemplo
No exemplo abaixo, você pode usar um script (muito) básico para definir uma sequência ou imprimir uma sequência, conforme definido no seu arquivo de configuração:
Então
Para definir uma string no seu arquivo de configuração:
Posteriormente, para imprimir a string, conforme definido no seu "arquivo de configuração":
Obviamente, em um script aplicado real, você precisa adicionar muitas coisas para garantir que os argumentos estejam corretos, decidir o que fazer quando a entrada estiver incorreta, o arquivo de configurações não existir etc., mas:
Essa é a ideia básica
fonte
Use
source
ou.
para carregar um arquivo.ou
Também é recomendável verificar se o arquivo existe antes de carregá-lo, porque você não deseja continuar executando seu script se um arquivo de configuração não estiver presente.
fonte
Eu estou usando este ...
O arquivo conf é analisado com sed e depois avaliado como atribuições variáveis simples
Primeiro sed analisando valores-chave (também suporta = cercado por espaços)
O segundo sed remove espaços ao redor = sinal para atribuição variável válida
Pode ser adicionado outro tratamento sed
Todos os outros textos não correspondentes no arquivo conf serão removidos (incluindo # ou; comentário e outros)
Esteja ciente de que os comandos do shell de linha única também podem ser avaliados neste arquivo de configuração!
fonte
cat
. Por que você invocased
duas vezes consecutivas? Você pode encadearsed
comandos da seguinte maneira:sed -r '/[^=]+=[^=]+/!d;s/\s+=\s/=/g'
sed
comando gerará uma saída vazia para as entradas do arquivo de configuração de amostra na pergunta. -1.
redirecionamento de comando e processo, em vez de variáveis temporárias, para manter a saída do subprocesso:. <(sed ... "$CFG_FILE")
eval $(sed -r '/[^=]+=[^=]+/!d;s/\s+=\s/=/g' "$CFG_FILE")
que é muito melhor para entender o que está acontecendo..
espera que um arquivo e a substituição do processo sejam expandidos para um arquivo.. <(echo echo foo)
funciona da maneira esperada no Bash v4.3.11. Em pequenos exemplos, provavelmente não importa. Eu preferiria não passar vários kilobytes através da substituição de comandos.fonte