Есть ли элегантный способ установить переменную оболочки для содержимого файла?


11

Скажем, у меня есть некоторые данные конфигурации в файле config. Для удобства я хотел бы загрузить эти данные в переменную оболочки CONFIG_DATA.

Очевидно, я могу сделать:

CONFIG_DATA="$(cat config)"

Но это своего рода бесполезное использованиеcat для меня. Это единственный способ сделать это? Или есть более элегантный способ сделать это?

Ответы должны отдавать предпочтение POSIX, но могут использовать любую оболочку.


2
Чтение всего файла в памяти, как это, почти всегда плохая идея, независимо от того, как вы его пишете.
Satō Katsura

2
@SatoKatsura в некоторых случаях очень верно. однако для целей этого вопроса вы можете предположить, что файл очень маленький, так что это не является серьезной проблемой.
Струджи

1
@SatoKatsura: почему?
RemcoGerlich

Ответы:


23

В Bash и Z shell, по крайней мере, есть более быстрый путь:

CONFIG_DATA=$(<config)

Цитирую со справочной страницы оболочки Bourne Again:

Подстановка команд $ (cat file) может быть заменена эквивалентной, но более быстрой $ (<file).


1
Я не считаю это хорошим вариантом. Каковы бы ни были чувства OP к бесполезному использованию кошки, пример OP достаточно прост, чтобы большинство пользователей Bash это поняли. Это также довольно портативный. Сейчас $(<file)это гораздо реже, так что это может привести к гораздо большему количеству WTF; и прирост скорости от этой операции, если такая конфигурация должна быть загружена в переменную, вероятно, незначителен
MatthewRock

6
@MatthewRock отмечают, что многие очень плохие практики распространены и знакомы. Бесполезное использование кошки - один пример, for i in $(cat file); do ...другой. То, что они распространены, не является причиной, чтобы продолжать использовать плохие инструменты. Это не означает, что это конкретное использование кошки - плохой слишком, я не уверен, есть ли более портативный способ. Просто говорю, что общее и знакомое! = Хорошо.
Тердон
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.