Existe uma maneira elegante de definir uma variável de shell para o conteúdo de um arquivo?


11

Digamos que eu tenha alguns dados de configuração em um arquivo config. Por conveniência, eu gostaria de carregar esses dados em uma variável do shell CONFIG_DATA,.

Obviamente eu posso fazer:

CONFIG_DATA="$(cat config)"

Mas isso parece um uso inútilcat para mim. Essa é a única maneira de fazer isso? Ou existe uma maneira mais elegante de fazer isso?

As respostas devem preferir o POSIX, mas podem usar qualquer shell.


2
Ler um arquivo inteiro na memória como este é quase sempre uma má ideia, independentemente de como você o escreve.
Satō Katsura

2
@SatoKatsura em alguns casos, muito verdadeiro. no entanto, para os fins desta pergunta, você pode assumir que o arquivo é super pequeno, portanto não é um problema grave.
strugee

1
@SatoKatsura: por quê?
RemcoGerlich

Respostas:


23

No Bash e no shell Z, pelo menos, existe uma maneira mais rápida:

CONFIG_DATA=$(<config)

Para citar a página de manual do shell Bourne Again:

A substituição do comando $ (arquivo cat) pode ser substituída pelo equivalente, mas mais rápido, $ (<file).


1
Eu não consideraria isso uma boa opção. Quaisquer que sejam os sentimentos do OP em relação ao uso inútil de gato, o exemplo do OP é simples o suficiente para que a maioria dos usuários do Bash o entenda. Também é bastante portátil. Agora $(<file)é muito menos comum, portanto, pode resultar em muito mais WTFs; e o ganho de velocidade a partir desta operação, se tal configuração é para ser carregado para uma variável, é provavelmente insignificante
MatthewRock

6
@MatthewRock observa que muitas práticas muito ruins são comuns e familiares. Os usos inúteis do gato são um exemplo, for i in $(cat file); do ...é outro. O fato de serem comuns não é motivo para continuar usando ferramentas ruins. O que não quer dizer que esse uso particular de gato seja ruim demais, não tenho certeza se existe uma maneira mais portátil. Apenas dizendo que comum e familiar! = Bom.
terdon
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.