Use env com variáveis de ambiente do arquivo

3

Digamos que eu tenha um arquivo (chamado e ) com este conteúdo:

a=3
b="5 6"

Como posso fazer com que cada um seja interpretado como um argumento separado para env ? Ou seja, para que seja equivalente a:

$ env a=3 b="5 6" ruby -e 'p ENV["a"]; p ENV["b"]'
"3"
"5 6"
$ env a=3 "b=5 6" ruby -e 'p ENV["a"]; p ENV["b"]'
"3"
"5 6"

Este obviamente não funciona por causa do espaço:

env $(cat e) ruby -e 'p ENV["a"]; p ENV["b"]'

Mas também não é este:

IFS=$'\n' env $(cat e) ruby -e 'p ENV["a"]; p ENV["b"]'

E a citação de $(cat e) resultará em:

"1\nb=2 3"
nil
    
por Artefacto 07.06.2016 / 13:27

2 respostas

2

Este é um exemplo de não usar a ferramenta certa para o trabalho. env não é a única ferramenta que define variáveis de ambiente e, em seguida, a cadeia carrega outro programa. E não lê dados variáveis do arquivo.

É claro que o comando . a.k.a. source também não é a ferramenta certa para esse trabalho.

  1. Permite que o arquivo contenha inesperadamente comandos de shell diferentes de atribuições de variáveis simples, o que, em determinadas circunstâncias (dependendo do arquivo de configuração), pode ser uma brecha de segurança.
  2. Uma série de atribuições, como no exemplo da pergunta, originada por . , define variáveis shell e não ambiente . Eles não são exportados automaticamente.

As ferramentas certas são ferramentas comuns de carregamento de corrente de vários conjuntos de ferramentas de tais ferramentas.

Um deles é o read-conf do conjunto de ferramentas para o nariz , projetado para ler exatamente esse tipo do arquivo de configuração (como /etc/rc.conf de - digamos - PC-BSD ) e definir variáveis de ambiente sem implementar e abrir arquivos de configuração data para uma sintaxe de linguagem de shell inteira:

jdebp % uname
Linux
jdebp % cat e
a=3
b="5 6"
jdebp % read-conf e printenv | tail -n 3
USER=jdebp
a=3
b=5 6
jdebp %
jdebp % uname
FreeBSD
jdebp % read-conf /etc/rc.conf printenv | head -n 2
cron_enable=NO
sendmail_msp_queue_enable=NO
jdebp %

Outra ferramenta desse tipo é runenv , do Wayne Marshall, do perp.

    
por 07.06.2016 / 14:41
2

Você nem precisa de env aqui. Em qualquer shell parecido com o Bourne (supondo que o arquivo esteja na sintaxe sh como no seu exemplo):

(set -a; . ./e && ruby -e 'p ENV["a"]; p ENV["b"]')

( set -a faz com que todas as futuras atribuições de variáveis sejam exportadas para o ambiente).

Você também pode fazer:

cat e - << 'EOF' | paste -sd ' ' - | sh
ruby -e 'p ENV["a"]; p ENV["b"]'
EOF

Isso é juntar todas as linhas no arquivo e e essa linha de comando ruby para construir uma linha de comando longa para sh interpretar (ainda assumindo que e arquivo está em sh sintaxe como aquelas aspas duplas sugerir). Isso pressupõe que as atribuições são de linha única.

    
por 07.06.2016 / 15:52