Czy istnieje elegancki sposób na ustawienie zmiennej powłoki na zawartość pliku?

11

Powiedzmy, że mam jakieś dane konfiguracyjne w pliku config. Dla wygody, chciałbym, aby załadować te dane do zmiennej powłoki CONFIG_DATA.

Oczywiście mogę:

CONFIG_DATA="$(cat config)"

Ale ten rodzaj wydaje mi się bezużytecznycat . Czy to jedyny sposób, aby to zrobić? A może jest to bardziej elegancki sposób?

Odpowiedzi powinny preferować POSIX, ale mogą używać dowolnej powłoki.

strugee
źródło
2
Czytanie całego pliku w pamięci w ten sposób jest prawie zawsze złym pomysłem, niezależnie od tego, jak go napiszesz.
Satō Katsura,
2
@SatoKatsura w niektórych przypadkach bardzo prawdziwe. jednak na potrzeby tego pytania możesz założyć, że plik jest bardzo mały, więc nie jest to poważny problem.
strugee
1
@SatoKatsura: dlaczego?
RemcoGerlich,

Odpowiedzi:

23

Przynajmniej w Bash i powłoce Z istnieje szybszy sposób:

CONFIG_DATA=$(<config)

Cytując ze strony podręcznika użytkownika powłoki Bourne Again:

Podstawienie polecenia $ (plik cat) można zastąpić równoważnym, ale szybszym $ (<plik).

Kamaraj
źródło
1
Nie uważam tego za dobrą opcję. Niezależnie od tego, jakie są odczucia OP wobec bezużytecznego używania kota, przykład OP jest na tyle prosty, że większość użytkowników Bash to zrozumie. Jest również dość przenośny. Teraz $(<file)jest znacznie mniej powszechny, więc może spowodować znacznie więcej WTF; a przyrost prędkości z tej operacji, jeśli taka konfiguracja ma zostać załadowana do zmiennej, jest prawdopodobnie nieistotny
MatthewRock
6
@MatthewRock zauważ, że wiele bardzo złych praktyk jest powszechnych i znanych. Bezużyteczne zastosowania kota to jeden przykład, for i in $(cat file); do ...to drugi. To, że są powszechne, nie jest powodem do używania złych narzędzi. Co nie znaczy, że to szczególne użycie kota jest złym tooi, nie jestem pewien, czy istnieje bardziej przenośny sposób. Po prostu mówienie, że pospolite i znane!
terdon