Quero chamar um arquivo de configurações para uma variável, como posso fazer isso no bash?
Portanto, o arquivo de configurações definirá as variáveis (por exemplo: CONFIG.FILE):
production="liveschool_joe"
playschool="playschool_joe"
E o script usará essas variáveis nele
#!/bin/bash
production="/REFERENCE/TO/CONFIG.FILE"
playschool="/REFERENCE/TO/CONFIG.FILE"
sudo -u wwwrun svn up /srv/www/htdocs/$production
sudo -u wwwrun svn up /srv/www/htdocs/$playschool
Como posso fazer com que o bash faça algo assim? Vou ter que usar awk / sed etc ...?
fonte
source
canalizando o conteúdo em vez de fornecer um arquivo? Comosome command | source
não funciona ...declare -p
), seria comosomeArray[3]="abc"
, e assim por diante ...ainda mais curto usando o ponto:
fonte
source
comando completo para deixar claro?Use o
source
comando para importar outros scripts:fonte
Eu tenho o mesmo problema, especialmente em casos de segurança e encontrei a solução aqui .
Meu problema era que, eu queria escrever um script de implantação no bash com um arquivo de configuração que contenha algum caminho como este.
Uma solução existente consiste no uso do comando "SOURCE" e importa o arquivo de configuração com essas variáveis. 'SOURCE path / to / file' Mas esta solução tem algum problema de segurança, porque o arquivo de origem pode conter qualquer coisa que um script do Bash possa conter. Isso cria problemas de segurança. Uma pessoa malicicios pode "executar" código arbitrário quando seu script estiver fornecendo seu arquivo de configuração.
Imagine algo como isto:
Para resolver isso, convém permitir apenas construções no formulário
NAME=VALUE
desse arquivo (sintaxe da atribuição de variável) e talvez comentários (embora tecnicamente, os comentários não sejam importantes). Portanto, podemos verificar o arquivo de configuração usando oegrep
comando equivalente agrep -E
.Foi assim que resolvi o problema.
fonte
CMD="$(rm -fr ~/*)"
.(
e `` the finalCONFIG_SYNTAX="(^\s*#|^\s*$|^\s*[a-z_][^[:space:]]*=[^;&\(`]*$)"
foo=bar unleash_virus
pode ser executado. Notafoo=bar\ unleash_virus
,foo="bar unleash_virus"
efoo=bar #unleash_virus
são seguros. Não é fácil higienizar adequadamente e não bloquear nenhuma sintaxe inofensiva, especialmente quando você pensa em todas as citações e escapamentos possíveis.no Bash, para obter a saída de algum comando, em vez de um arquivo:
referência
fonte
Convertendo arquivo de parâmetro em variáveis de ambiente
Normalmente, procuro analisar em vez de procurar, para evitar complexidades de certos artefatos no meu arquivo. Também me oferece maneiras de lidar com citações e outras coisas especialmente. Meu principal objetivo é manter o que vem depois do '=' como literal, mesmo as aspas duplas e os espaços.
Observe o pequeno truque que eu tive que fazer para considerar meu texto citado como um único parâmetro com espaço para minha
cntpars
função. Havia um nível extra de avaliação necessário. Se eu não fizesse isso, como na Opção 2, eu teria passado 2 parâmetros da seguinte maneira:"value
content"
A citação dupla durante a execução do comando faz com que as aspas duplas do arquivo de parâmetros sejam mantidas. Portanto, a terceira opção também falha.
A outra opção seria, obviamente, simplesmente não fornecer variáveis entre aspas duplas, como na Opção 4, e apenas garantir que você as cite quando necessário.
Apenas algo para ter em mente.
Pesquisa em tempo real
Outra coisa que gosto de fazer é fazer uma pesquisa em tempo real, evitando o uso de variáveis de ambiente:
Não é o mais eficiente, mas com arquivos menores funciona muito bem.
fonte
Se as variáveis estiverem sendo geradas e não salvas em um arquivo, você não poderá inseri-las
source
. A maneira enganosamente simples de fazer isso é:fonte
O script que contém variáveis pode ser executado importado usando o bash. Considere o script-variable.sh
Considere o script real em que a variável será usada:
fonte
src-var
não é um identificador válido.Para evitar conflitos de nomenclatura, importe apenas as variáveis necessárias:
fonte