bash adiciona apóstrofos à variável expandida

1

Estou lendo em um arquivo dentro do meu script, onde cada linha consiste em várias colunas como esta:

ANSIBLE 'first run' '--diff --extra-vars "client=yes fast=no"'

Como você pode ver, a linha consiste em três colunas, aquelas com espaços em branco em apóstrofos. A terceira coluna contém opções para um binário a ser chamado. Ao ler o arquivo, armazenei essas opções em uma variável:

custom_options=${columns[2]}

Isso é avaliado como

custom_options='--diff --extra-vars "client=yes fast=no"'

Agora quero executar meu binário com essas opções:

ansible-playbook $custom_options site.yml

No entanto, isso falha porque, na execução, foram adicionados apóstrofos ao redor da string interna:

ansible-playbook --diff --extra-vars '"client=yes fast=no"' site.yml

Alguém sabe como substituir a variável string como está?

Aqui está um pequeno script para reproduzir rapidamente o comportamento:

#!/bin/bash
set -x
touch "as is"
command='-name "as is"'
find . $command -type f
    
por Thomas Steinbach 03.03.2016 / 20:41

1 resposta

2

Encontrei uma solução alternativa em vez de uma solução. Eu rodei todo o comando com a variável dentro de uma expressão eval :

eval "ansible-playbook $custom_options site.yml"

Aqui, o uso equivalente no script de exemplo:

...
eval "find . $command -type f"

Eu não sou nenhum guru e não sei se essa solução alternativa tem algum efeito colateral. No entanto, eu testei o seguinte:

  • o eval trabalha com pipes: eval "command | tee file"
  • as cotações dentro do eval são possíveis: eval "command \"${var}\""

No entanto, ajusta-se às minhas necessidades, mas parece sujo. Melhores soluções são bem vindas.

    
por 03.03.2016 / 21:35