Чи є елегантний спосіб встановити змінну оболонки до вмісту файлу?


11

Скажімо, у мене є деякі дані конфігурації у файлі config. Для зручності, я хотів би завантажити ці дані в змінну оболонки CONFIG_DATA.

Очевидно, що я можу:

CONFIG_DATA="$(cat config)"

Але це виглядає як марне використанняcat для мене. Це єдиний спосіб зробити це? Або є більш елегантний спосіб це зробити?

Відповіді повинні віддавати перевагу POSIX, але можуть використовувати будь-яку оболонку.


2
Читання цілого файлу в такій пам'яті майже завжди є поганою ідеєю, незалежно від того, як ви його пишете.
Satō Katsura

2
@SatoKatsura в деяких випадках дуже правдивий. однак для цілей цього питання ви можете припустити, що файл дуже крихітний, тому це не є основною проблемою.
strugee

1
@SatoKatsura: чому?
RemcoGerlich

Відповіді:


23

Принаймні, у Bash та Z оболонки є більш швидкий шлях:

CONFIG_DATA=$(<config)

Щоб цитувати зі сторінки чоловіка оболонки Bourne Again:

Заміна команди $ (файл cat) може бути замінена на еквівалентний, але швидший $ (<файл).


1
Я б не вважав це хорошим варіантом. Якими б не були почуття ОП щодо марного використання кота, приклад ОП досить простий, щоб більшість користувачів Bash зрозуміли це. Він також досить портативний. Зараз $(<file)це набагато рідше, тому це може призвести до набагато більше WTF; а приріст швидкості від цієї операції, якщо таку конфігурацію потрібно завантажувати до змінної, ймовірно, незначний
MatthewRock

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