Quando os espaços ao redor do sinal = são proibidos?

9

Eu sei que em ~ / .bashrc é preciso não colocar espaços em torno de = sinais em atribuição:

$ tail -n2 ~/.bashrc 
alias a="echo 'You hit a!'"
alias b = "echo 'You hit b!'"

$ a
You hit a!

$ b
b: command not found

Estou revisando o arquivo de configuração do MySQL /etc/my.cnf e descobri o seguinte:

tmpdir=/mnt/ramdisk
key_buffer_size = 1024M
innodb_buffer_pool_size = 512M
query_cache_size=16M

Como posso verificar se os espaços em torno dos sinais = não são um problema?

Observe que essa questão não é específica do arquivo /etc/my.cnf , mas sim dos arquivos de configuração * NIX em geral. Minha primeira inclinação é para o RTFM, mas na verdade man mysql não menciona a questão e se eu precisar ir caçar on-line para cada caso, nunca vou chegar a lugar nenhum. Existe alguma convenção ou maneira fácil de verificar? Como pode ser visto, várias pessoas editaram este arquivo (convenções diferentes para = sinais) e eu não posso forçá-los a usar nenhum espaço, nem posso ficar louco verificando tudo o que pode ter sido configurado e pode ou não estar correto.

EDIT: Minha intenção é garantir que os arquivos atualmente configurados sejam feitos corretamente. Quando eu mesmo configuro os arquivos, eu vou com a convenção de qualquer coisa que o mantenedor do pacote tenha colocado lá.

    
por dotancohen 24.07.2014 / 11:23

5 respostas

3

Responderei isso de uma maneira mais geral - parecendo um pouco com toda a "experiência de aprendizado Unix ".

No seu exemplo, você usa duas ferramentas e vê o idioma como semelhante. Apenas não está claro quando usar exatamente o que. É claro que você pode esperar que haja uma estrutura clara, então você nos pede para explicar isso.
O caso com o espaço em torno de = é apenas e exemplo - há muitos casos de semelhantes, mas-bot-bastante .
tem que ser uma lógica, certo?!

As regras como escrever código para alguma ferramenta , shell, banco de dados etc dependem apenas do que essa ferramenta específica requer

Isso significa que as ferramentas são completamente independentes , tecnicamente. A relação lógica que eu acho que você espera simplesmente não existe .

A óbvia semelhança dos idiomas que você está vendo não faz parte da implementação do programm . A semelhança existe porque os desenvolvedores concordaram em fazê-lo quando o escreveram para um programa em particular. Mas os humanos podem concordar apenas parcialmente .

A relação que você vê é uma coisa cultural - não é nenhuma parte da implementação , nem em a definição da linguagem .


Então, agora que temos handeled a teoria, o que fazer na prática?

Um grande passo é aceitar que a consistência que você esperava não existe - o que é muito mais fácil ao entender as razões - Espero que a parte teórica ajude com isso.

Se você tem duas ferramentas, que não usam a mesma linguagem de configuração (por exemplo, ambos bash scripting), saber os detalhes da sintaxe de um não ajuda muito na compreensão do outro; Então, de fato, você terá que pesquisar detalhes independentemente . Certifique-se de saber onde você encontra a documentação de referência para cada um.

No lado positivo, há alguma consistência em que você não esperava: no contexto de uma única ferramenta (ou ferramentas diferentes usando o mesmo idioma), você pode ter certeza de que a sintaxe é consistente.
No seu mysql exemplo, isso significa que você pode assumir que todas as linhas têm a mesma regra. Portanto, a regra é "espaço antes e depois de = ser não relevante ".

Existem diferenças em quão hard é aprender ou usar a linguagem de configuração ou script de uma ferramenta.
Pode ser algo como " Listar valores foo em cmd-foo.conf, um por linha". Pode ser uma linguagem de script completa que também é usada em outros lugares. Então você tem uma ferramenta poderosa para escrever configuração - e em alguns casos isso é legal, em outros você realmente precisa disso.
Ferramentas complexas , ou grandes famílias de ferramentas relacionadas às vezes usam muito < Sintaxe de arquivo strong> complex special configuration
- (alguns exemplos famosos são sendmail e vim ).
Outros usam uma linguagem geral de script como base, e estende essa linguagem para suportar as necessidades especiais , algumas vezes de formas complexas, conforme a linguagem permite . Isso seria um caso muito específico de um idioma específico do domínio ( DSL ) .

    
por 25.07.2014 / 10:49
20

O Bash interpretará uma linha com texto seguido por = como uma atribuição a uma variável, mas interpretará uma linha que tenha texto seguido por um espaço como um comando com um argumento.

var=assignment vs command =argument

Os scripts Bash funcionam com base no princípio de que tudo no script é como se você o tivesse digitado na linha de comando.

Nos arquivos de configuração que não são interpretados por bash (ou outro shell), ele será determinado pelo analisador usado para ler o arquivo de configuração. Alguns analisadores terão espaços, outros não. Cabe ao aplicativo nesse caso. Pessoalmente, eu uso qualquer convenção usada pelo arquivo de configuração padrão.

    
por 24.07.2014 / 11:41
4

.bashrc nada mais é do que um arquivo de configuração para bash, assim como my.cnf, php.ini, httpd.conf ou um launchlist. Cada um tem sua própria sintaxe, desde a atribuição sem espaço do bash à sopa de lançamento XML (há também uma versão binária: -O)

Não há convenções firmes, e você já descobriu a Primeira Diretriz do Unix: Leia o Fine Manual.

    
por 24.07.2014 / 15:18
3

Alguns programas oferecem uma verificação do arquivo de configuração, por exemplo:

postfix check

Caso contrário, você poderia obter os arquivos de configuração originais dos repositórios e compará-los com diff para o atual.

    
por 24.07.2014 / 15:52
2

Os espaços em torno de = sign sempre são um problema quando você faz uma atribuição em bash . Não há exceção aqui, você deve remover todos os espaços em torno de = se você deseja obter uma atribuição simples válida (sem expansão, sem aritmética, sem atribuição de matriz) em bash .

Para o arquivo de configuração, porque cada software tem seu próprio analisador para analisar seu arquivo de configuração, bash não tem nenhum relacionamento. Você deve ler a documentação para saber qual a sintaxe permitida no arquivo de configuração.

Um exemplo é mysql , em seu script de inicialização /etc/init.d/mysqld , ele tem um analisador para my.cnf :

# Try to find basedir in /etc/my.cnf
  conf=/etc/my.cnf
  print_defaults=
  if test -r $conf
  then
    subpat='^[^=]*basedir[^=]*=\(.*\)$'
    dirs='sed -e "/$subpat/!d" -e 's///' $conf'
    for d in $dirs
    do
      d='echo $d | sed -e 's/[  ]//g''
      if test -x "$d/bin/my_print_defaults"
      then
        print_defaults="$d/bin/my_print_defaults"
        break
      fi
      if test -x "$d/bin/mysql_print_defaults"
      then
        print_defaults="$d/bin/mysql_print_defaults"
        break
      fi
    done
  fi
    
por 24.07.2014 / 12:26