Esiste un modo elegante per impostare una variabile di shell sul contenuto di un file?


11

Supponiamo di avere alcuni dati di configurazione in un file config. Per comodità, mi piacerebbe per caricare questi dati in una variabile di shell, CONFIG_DATA.

Ovviamente posso fare:

CONFIG_DATA="$(cat config)"

Ma questo mi sembra un uso inutile dicat me. È l'unico modo per farlo? O c'è un modo più elegante per farlo?

Le risposte dovrebbero preferire POSIX ma possono usare qualsiasi shell.


2
Leggere un intero file in memoria come questo è quasi sempre una cattiva idea, indipendentemente da come lo scrivi.
Satō Katsura,

2
@SatoKatsura in alcuni casi è vero. tuttavia, ai fini di questa domanda, è possibile supporre che il file sia molto piccolo, quindi non è un grosso problema.
Strugee,

1
@SatoKatsura: perché?
Remco Gerlich,

Risposte:


23

In Bash e nella shell Z, almeno, c'è un modo più veloce:

CONFIG_DATA=$(<config)

Per citare dalla pagina man della shell Bourne Again:

La sostituzione del comando $ (file cat) può essere sostituita da $ (<file) equivalente ma più veloce.


1
Non lo considero una buona opzione. Qualunque siano i sentimenti di OP nei confronti dell'uso inutile di cat, l'esempio dell'OP è abbastanza semplice da essere compreso dalla maggior parte degli utenti di Bash. È anche abbastanza portatile. Ora $(<file)è molto meno comune, quindi potrebbe tradursi in molti più WTF; e il guadagno di velocità da questa operazione, se tale configurazione deve essere caricata su una variabile, è probabilmente trascurabile
MatthewRock,

6
@MatthewRock nota che molte cattive pratiche sono comuni e familiari. Gli usi inutili del gatto sono un esempio, for i in $(cat file); do ...è un altro. Il fatto che siano comuni non è un motivo per continuare a utilizzare strumenti dannosi. Il che non vuol dire che questo particolare uso del gatto sia un male tooi, non sono sicuro che ci sia un modo più portatile. Sto solo dicendo che comune e familiare! = Buono.
terdon
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.